Jadual Kandungan
Contoh
Kaedah 2
Algoritma
Output
Rumah pembangunan bahagian belakang C++ Tambah urutan minimum yang diperlukan untuk menambah rentetan A untuk mendapatkan rentetan B

Tambah urutan minimum yang diperlukan untuk menambah rentetan A untuk mendapatkan rentetan B

Sep 10, 2023 pm 02:41 PM
rentetan pesanan anak dapatkan

Tambah urutan minimum yang diperlukan untuk menambah rentetan A untuk mendapatkan rentetan B

Dalam masalah ini, kita perlu membina str2 menggunakan urutan str1. Untuk menyelesaikan masalah ini, kita boleh mencari urutan str1 supaya ia meliputi subrentetan panjang maksimum str2. Di sini kita akan mempelajari dua cara berbeza untuk menyelesaikan masalah tersebut.

Pernyataan MasalahKami diberi dua tali yang berbeza panjang: str1 dan str2. Kita perlu membina str2 daripada str1 mengikut syarat berikut.

  • Pilih mana-mana urutan daripada str1 dan tambahkannya pada rentetan baharu (pada mulanya kosong).

Kami perlu mengembalikan bilangan minimum operan yang diperlukan untuk membina str2, atau mencetak -1 jika str2 tidak boleh dibina.

Contoh

Masukkan – str1 = “acd”, str2 = “adc”

Output– 2

Arahan

    Susunan pertama dalam
  • str1 ialah "iklan". Jadi, rentetan kami boleh menjadi "iklan".

  • Selepas itu, kita boleh mendapatkan jujukan "c" daripada str1 dan menambahkannya pada "ad" untuk menjadikannya "adc".

Input– str1 = "adcb", str2 = "abdca"

Output–3

Arahan

  • Jujukan pertama ialah "ab" dalam str1.

  • Selepas itu, kita boleh mendapatkan rentetan "dc" dan rentetan yang terhasil ialah "abdc"

  • Seterusnya, kita boleh menggunakan urutan "a" untuk menjana rentetan akhir "abdca".

Kaedah 1

Dalam kaedah ini, kami akan mengulangi str1 untuk mencari berbilang urutan dan menambahkannya pada rentetan yang terhasil.

Algoritma

  • Tentukan tatasusunan "arr" dengan panjang 26 dan mulakan semua elemen kepada 0 untuk menyimpan kehadiran aksara dalam str1.

  • Lelaran str1 dan kemas kini nilai elemen tatasusunan mengikut nilai ASCII aksara

  • Tentukan pembolehubah "terakhir" dan mulakan dengan -1 untuk menjejaki elemen terakhir yang dilawati. Selain itu, tentukan pembolehubah "cnt" dan mulakannya kepada 0 untuk menyimpan kiraan operasi.

  • Mula menggunakan gelung untuk melintasi str2.

  • Jika aksara semasa tiada dalam str1, kembalikan -1.

  • Mulakan pembolehubah "j" dengan nilai "terakhir + 1".

  • Gunakan gelung sementara untuk lelaran sehingga nilai j kurang daripada len dan str1[j] tidak sama dengan aksara

  • Jika nilai 'j' lebih besar daripada 'len', kami akan melelang ke atas 'str1'. Tingkatkan nilai pembolehubah 'cnt', mulakan 'last' kepada -1 kerana kita perlu mengulangi 'str1' sekali lagi, kurangkan nilai 'I' sebanyak 1 kerana kita perlu mempertimbangkan aksara semasa sekali lagi, teruskan menggunakan 'teruskan' kata kunci Lelaran.

  • Kemas kini nilai pembolehubah "terakhir" kepada "j".

  • Kembalikan "cnt + 1" selepas semua lelaran gelung selesai. Di sini, kita perlu menambah "1" kepada "cnt" kerana kita tidak mempertimbangkan operasi terakhir.

Contoh

#include <iostream>
using namespace std;

// function to count the minimum number of operations required to get string str2 from subsequences of string str1.
int minOperations(string str1, string str2){
   int len = str1.length();
   // creating an array of size 26 to store the presence of characters in string str1.
   int arr[26] = {0};
   // storing the presence of characters in string str1.
   for (int i = 0; i < len; i++){
      arr[str1[i] - 'a']++;
   }
   // store the last iterated index of string str1.
   int last = -1;
   //  to store the count of operations.
   int cnt = 0;
   for (int i = 0; i < str2.length(); i++){
      char ch = str2[i];
      // if the character is not present in string str1, then return -1.
      if (arr[ch - 'a'] == 0){
         return -1;
      }
      // start iterating from the jth index of string str1 to find the character ch.
      int j = last + 1;
      while (j < len && str1[j] != ch){
          j++;
      }
      // if j is equal to the length of string str1, then increment the count, set last to -1, and decrement i.
      if (j >= len){
         cnt++;
         last = -1;
         --i;
         continue;
      }
      // set last to j.
      last = j;
   }
   // return cnt + 1 as we haven't counted the last operation.
   return cnt + 1;
}
int main(){
   string str1 = "acd", str2 = "adc";
   int operations = minOperations(str1, str2);
   cout << "Minimum number of operations required to create string B from the subsequences of the string A is: " << operations << "\n";
   return 0;
}
Salin selepas log masuk

Output

Minimum number of operations required to create string B from the subsequences of the string A is: 2
Salin selepas log masuk

Kerumitan masa – O(N*M), dengan N ialah panjang str2 dan M ialah panjang str1.

Kerumitan ruang - O(1) kerana kami tidak menggunakan sebarang ruang dinamik.

Kaedah 2

Dalam kaedah ini, kami akan menggunakan struktur data pemetaan dan pengumpulan untuk meningkatkan kecekapan kaedah di atas. Logik untuk menyelesaikan masalah adalah sama seperti di atas.

Algoritma

  • Takrifkan "chars_mp" untuk menyimpan char -> set{} sebagai pasangan nilai kunci.

  • Dalam peta, simpan set indeks di mana aksara tertentu wujud dalam rentetan str1

  • Tentukan pembolehubah "terakhir" dan "cnt"

  • Mula melintasi str2. Jika saiz koleksi yang mengandungi indeks aksara semasa ialah sifar, -1 dikembalikan.

  • Cari had atas "terakhir" dalam set indeks aksara semasa.

  • Jika had atas tidak ditemui, naikkan nilai "cnt" sebanyak 1, tetapkan "last" kepada -1, kurangkan nilai "I" sebanyak 1, dan gunakan kata kunci continue.

  • Kemas kini nilai pembolehubah "terakhir".

  • Selepas lelaran gelung selesai, kembalikan nilai pembolehubah 'cnt'

Contoh

#include <iostream>
#include <map> 
#include <set>
using namespace std;

// function to count the minimum number of operations required to get string str2 from subsequences of string str1.
int minOperations(string str1, string str2){
   // Length of string str1
   int len = str1.length();
   // creating the map to store the set of indices for each character in str1
   map<char, set<int>> chars_mp;
   // Iterate over the characters of str1 and store the indices of each character in the map
   for (int i = 0; i < len; i++){
      chars_mp[str1[i]].insert(i);
   }
   // store the last visited index of str1
   int last = -1;
   // Stores the required count
   int cnt = 1;
   // Iterate over the characters of str2
   for (int i = 0; i < str2.length(); i++){
      char ch = str2[i];
      // If the set of indices of str2[i] is empty, then return -1
      if (chars_mp[ch].size() == 0){
         return -1;
      }
      // If the set of indices of str2[i] is not empty, then find the upper bound of last in the set of indices of str2[i]
      // It finds the smallest index of str2[i] which is greater than last
      auto it = chars_mp[ch].upper_bound(last);
      // If the upper bound is equal to the end of the set, then increment the count and update last to -1
       if (it == chars_mp[ch].end()){
          last = -1;
          cnt++;
          // Decrement I by 1 to process the current character again
          --i;
          continue;
      }
      // Update last to the current index
      last = *it;
   }
   return cnt;
}
int main(){
   string str1 = "adcb", str2 = "abdca";
   int operations = minOperations(str1, str2);
   cout << "Minimum number of operations required to create string B from the subsequences of the string A is: " << operations << "\n";
   return 0;
}
Salin selepas log masuk

Output

Minimum number of operations required to create string B from the subsequences of the string A is: 3
Salin selepas log masuk

Kerumitan masa – O(N*logN), memandangkan kita mengulangi str2 dan mencari sempadan atas indeks "terakhir" dalam gelung.

Kerumitan ruang – O(N) kerana kami menggunakan peta untuk menyimpan indeks aksara.

Atas ialah kandungan terperinci Tambah urutan minimum yang diperlukan untuk menambah rentetan A untuk mendapatkan rentetan B. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mendapatkan Crimson Abyss of War Double Pamish Lucia Bagaimana untuk mendapatkan Crimson Abyss of War Double Pamish Lucia Mar 25, 2024 pm 05:31 PM

Pemain boleh mendapatkan Lucia's Crimson Abyss apabila bermain dalam Battle Double Pamish Ramai pemain tidak tahu cara mendapatkan Lucia's Crimson Abyss Pemain boleh mendapatkannya melalui penyelidikan dan pembangunan, atau menebusnya di kedai Phantom Pain Cage. Cara mendapatkan R&D untuk Battle Double Pamish Lucia Crimson Abyss 1. Pemain boleh mendapatkannya dengan menggunakan sistem R&D, yang merangkumi kumpulan kad asas, kumpulan kad terhad tema dan kumpulan kad takdir terhad 2. Didedahkan dalam kumpulan kad ini Kadar penurunan asas Sia Crimson Abyss ialah 1.50%, tetapi jika pemain menarik Lucia Crimson Abyss daripada kumpulan kad, kadar penurunan akan meningkat kepada 1.90%. Penebusan di Stor Hantu Sakit Sangkar 1. Pemain boleh menebus serpihan Lucia Crimson Abyss dengan menggunakan Parut Sakit Hantu di Stor Sangkar Sakit Hantu. 2. Anda boleh menebus sehingga 30 serpihan setiap minggu.

Bagaimana untuk mendapatkan hak pentadbir dalam sistem Win11 Bagaimana untuk mendapatkan hak pentadbir dalam sistem Win11 Mar 08, 2024 pm 10:00 PM

Adalah sangat penting untuk mendapatkan hak pentadbir dalam sistem Win11, kerana hak pentadbir membenarkan pengguna melakukan pelbagai operasi dalam sistem, seperti memasang perisian, mengubah suai tetapan sistem, dsb. Mendapatkan hak pentadbir dalam sistem Win11 boleh dicapai melalui kaedah berikut: Kaedah pertama adalah melalui tetapan kawalan akaun pengguna. Dalam sistem Win11, Kawalan Akaun Pengguna ialah fungsi yang digunakan untuk mengurus kebenaran pengguna Melaluinya, pengguna boleh melaraskan tahap kebenaran mereka. Untuk mendapatkan hak pentadbir, pengguna boleh memasuki antara muka "Tetapan" dan pilih "

Bagaimana untuk menentukan sama ada rentetan Golang berakhir dengan aksara yang ditentukan Bagaimana untuk menentukan sama ada rentetan Golang berakhir dengan aksara yang ditentukan Mar 12, 2024 pm 04:48 PM

Tajuk: Bagaimana untuk menentukan sama ada rentetan berakhir dengan aksara tertentu dalam Golang Dalam bahasa Go, kadangkala kita perlu menentukan sama ada rentetan berakhir dengan aksara tertentu Ini adalah perkara biasa semasa memproses rentetan. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk melaksanakan fungsi ini dan memberikan contoh kod untuk rujukan anda. Mula-mula, mari kita lihat cara untuk menentukan sama ada rentetan berakhir dengan aksara tertentu dalam Golang. Aksara dalam rentetan dalam Golang boleh diperoleh melalui pengindeksan, dan panjang rentetan itu boleh

Penjelasan terperinci tentang kaedah menukar jenis int kepada rentetan dalam PHP Penjelasan terperinci tentang kaedah menukar jenis int kepada rentetan dalam PHP Mar 26, 2024 am 11:45 AM

Penjelasan terperinci tentang kaedah menukar jenis int kepada rentetan dalam PHP Dalam pembangunan PHP, kita sering menghadapi keperluan untuk menukar jenis int kepada jenis rentetan. Penukaran ini boleh dicapai dalam pelbagai cara Artikel ini akan memperkenalkan beberapa kaedah biasa secara terperinci, dengan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik. 1. Gunakan fungsi terbina dalam PHP strval(). PHP menyediakan fungsi terbina dalam strval() yang boleh menukar pembolehubah jenis yang berbeza kepada jenis rentetan. Apabila kita perlu menukar jenis int kepada jenis rentetan,

Cara memintas rentetan dalam bahasa Go Cara memintas rentetan dalam bahasa Go Mar 13, 2024 am 08:33 AM

Bahasa Go ialah bahasa pengaturcaraan yang berkuasa dan fleksibel yang menyediakan fungsi pemprosesan rentetan yang kaya, termasuk pemintasan rentetan. Dalam bahasa Go, kita boleh menggunakan kepingan untuk memintas rentetan. Seterusnya, kami akan memperkenalkan secara terperinci cara memintas rentetan dalam bahasa Go, dengan contoh kod khusus. 1. Gunakan penghirisan untuk memintas rentetan Dalam bahasa Go, anda boleh menggunakan ungkapan menghiris untuk memintas sebahagian daripada rentetan. Sintaks ungkapan slice adalah seperti berikut: slice:=str[start:end]where, s

Bagaimana untuk mengulangi rentetan dalam python_python mengulangi tutorial rentetan Bagaimana untuk mengulangi rentetan dalam python_python mengulangi tutorial rentetan Apr 02, 2024 pm 03:58 PM

1. Mula-mula buka pycharm dan masukkan halaman utama pycharm. 2. Kemudian buat skrip python baru, klik kanan - klik baru - klik pythonfile. 3. Masukkan rentetan, kod: s="-". 4. Kemudian anda perlu mengulang simbol dalam rentetan sebanyak 20 kali, kod: s1=s*20 5. Masukkan kod output cetakan, kod: print(s1). 6. Akhir sekali jalankan skrip dan anda akan melihat nilai pulangan kami di bahagian bawah: - diulang 20 kali.

Bagaimana untuk menyelesaikan masalah aksara Cina yang kacau apabila menukar perenambelasan kepada rentetan dalam PHP Bagaimana untuk menyelesaikan masalah aksara Cina yang kacau apabila menukar perenambelasan kepada rentetan dalam PHP Mar 04, 2024 am 09:36 AM

Kaedah untuk menyelesaikan masalah aksara Cina yang kacau apabila menukar rentetan perenambelasan dalam PHP Dalam pengaturcaraan PHP, kadangkala kita menghadapi situasi di mana kita perlu menukar rentetan heksadesimal kepada aksara Cina biasa. Walau bagaimanapun, dalam proses penukaran ini, kadangkala anda akan menghadapi masalah aksara Cina yang kacau. Artikel ini akan memberi anda kaedah untuk menyelesaikan masalah aksara Cina yang bercelaru apabila menukar perenambelasan kepada rentetan dalam PHP dan memberikan contoh kod khusus. Gunakan fungsi hex2bin() untuk penukaran heksadesimal PHP terbina dalam fungsi hex2bin() boleh menukar 1

Bagaimana untuk mendapatkan Eldon's Ring Torret Bagaimana untuk mendapatkan Eldon's Ring Torret Mar 11, 2024 am 11:40 AM

Torret ialah kuda semangat dalam permainan Elden's Circle Ramai pemain tidak tahu cara mendapatkan Torret of Elden's Circle Untuk memanggil Torret, pemain perlu mendapatkan wisel kuda semangat, yang dilengkapi di bar pintasan kekunci pintasan untuk memanggil kuda semangat Torret. Bagaimana untuk mendapatkan Torret of Elden's Ring Jawapan: Anda perlu mendapatkan Whistle of the Spirit Horse? 1. Pemain perlu mendapatkan Wisel Kuda Roh untuk memanggil Torret. 2. Pemain pergi dari titik kelahiran orang baru ke titik berkat di hadapan Jalan Ribut, duduk di tepi unggun api, dan heroin [Melina] akan muncul, dan dia akan memberi anda cincin [Spirit Horse Whistle]. 3. Selepas pemain melengkapkan "Spirit Horse Whistle" ke bar pintasan dan kemudian menggunakan Spirit Horse Whistle, dia boleh memanggil jiwa kuda Thoret. 4. Selepas menunggang kuda semangat Torret, anda boleh melakukan lompatan berganda Anda boleh melompat sambil berjalan tetapi tidak boleh melompat.

See all articles