Susun semula aksara dalam rentetan supaya mana-mana dua aksara bersebelahan berbeza, dilaksanakan dalam C++

WBOY
Lepaskan: 2023-08-26 22:37:19
ke hadapan
770 orang telah melayarinya

Susun semula aksara dalam rentetan supaya mana-mana dua aksara bersebelahan berbeza, dilaksanakan dalam C++

Kami diberi rentetan, andaikan ia adalah str, panjangnya boleh menjadi apa-apa nilai. Tugasnya adalah untuk menyusun semula rentetan yang diberikan supaya aksara bersebelahan yang sama tidak berbaris bersama dalam rentetan yang terhasil.

Mari kita lihat pelbagai senario input dan output:

Input − String str = "itinn"

Output − Susun semula aksara dalam rentetan supaya dua aksara yang bersebelahan, hasilnya tidak sama. initn.

Penjelasan − Kami diberi pembolehubah jenis rentetan, dengan mengandaikan ia adalah str. Sekarang kita akan menyusun semula aksara rentetan input supaya tiada dua aksara yang sama muncul dalam kedudukan yang sama, iaitu alihkan 'nn' ke kedudukan bukan bersebelahan. Jadi keputusan akhir ialah Rentetan itu akan menjadi 'initn'.

Input − String str = "abbaabbaa"

Output − Aksara dalam rentetan itu disusun semula supaya aksara bersebelahan berbeza: ababababa

diberikan Webabababa pembolehubah jenis rentetan, dengan mengandaikan ia adalah str. Sekarang kita akan menyusun semula aksara rentetan input supaya tiada dua aksara yang sama muncul dalam kedudukan yang sama iaitu gerakkan 'bb', 'aa', 'bb', 'aa' kerana ia adalah sama dan bersebelahan . Jadi rentetan terakhir akan menjadi 'ababababa'.

Kaedah yang digunakan dalam atur cara di bawah adalah seperti berikut

  • Masukkan pembolehubah jenis rentetan, dengan mengandaikan ia adalah str, dan hitung saiz rentetan dan simpannya dalam pembolehubah bernama panjang.

  • Periksa sama ada panjang adalah 0, kemudian kembali.

  • Hantar data ke fungsi Susunan Semula(str, panjang).

  • Di dalam fungsi Penyusunan Semula(arr, panjang)

    • menetapkan saiz rentetan kepada (panjang + 1)/2.

    • Isytiharkan pembolehubah jenis vektor vec(26, 0), yang akan menyimpan data jenis integer dan penunjuk jenis rentetan ptr(panjang, ‘ ‘). Juga mengisytiharkan temp pembolehubah sementara, jenis integer dan nilai 0.

    • Mulakan gelung UNTUK untuk lelaran str. Di dalam gelung, tetapkan vec[it - ‘a’]++.

    • Buat pembolehubah jenis aksara ch dan tetapkannya kepada hasil panggilan fungsi maksimum(vec).

    • Isytiharkan jumlah pembolehubah jenis integer dan tetapkannya kepada vec[ch - ‘a’].

    • Periksa jika jumlah lebih besar daripada saiz kemudian kembalikan.

    • Mulakan gelung WHILE jumlah, kemudian tetapkan ptr[temp] kepada ch, tetapkan suhu kepada suhu + 2 dan turunkan jumlah sebanyak 1.

    • Tetapkan vec[ch - 'a'] kepada 0. Mulakan gelung FOR dari i ke 0 sehingga i kurang daripada 26. Di dalam gelung, mulakan gelung while, apabila vec[i] lebih besar daripada 0, tetapkan temp kepada (temp >= length) 1: temp, set ptr[temp] kepada 'a' + i, set temp to temp + 2, dan susut vec[i] sebanyak 1.

    • Kembalikan ptr

  • Di dalam fungsi char maximum(const vector& vec)

    • isytihar pembolehubah jenis integer 0 dan tetapkan a kepada ubah jenis integer c. dan tetapkan a kepada ubah jenis integer c.

    • Mulakan gelung FOR dari i ke 0 sehingga i kurang daripada 26. Di dalam gelung, semak sama ada vec[i] kurang daripada tinggi, kemudian tetapkan tinggi kepada vec[i] dan c kepada 'a' + i.

    • Kembali ke c

  • Cetak hasil.

Contoh

#include <bits/stdc++.h>
using namespace std;
char maximum(const vector<int>& vec){
   int high = 0;
   char c;
   for(int i = 0; i < 26; i++){
      if(vec[i] > high){
         high = vec[i];
         c = &#39;a&#39; + i;
      }
   }
   return c;
}
string Rearrangement(string str, int length){
   int size = (length + 1) / 2;
   vector<int> vec(26, 0);
   string ptr(length, &#39; &#39;);
   int temp = 0;
   for(auto it : str){
      vec[it - &#39;a&#39;]++;
   }
   char ch = maximum(vec);
   int total = vec[ch - &#39;a&#39;];
   if(total > size){
      return "";
   }
   while(total){
      ptr[temp] = ch;
      temp = temp + 2;
      total--;
   }
   vec[ch - &#39;a&#39;] = 0;
   for(int i = 0; i < 26; i++){
      while (vec[i] > 0){
         temp = (temp >= length) ? 1 : temp;
         ptr[temp] = &#39;a&#39; + i;
         temp = temp + 2;
         vec[i]--;
      }
   }
   return ptr;
}
int main(){
   string str = "itinn";
   int length = str.length();
   if(length == 0){
      cout<<"Please enter a valid string";
   }
   string count = Rearrangement(str, length);
   if(count == ""){
      cout<<"Please enter a valid string";
   }
   else{
      cout<<"Rearrangement of characters in a string such that no two adjacent are same is: "<<count;
   }
   return 0;
}
Salin selepas log masuk

Output

Jika kita menjalankan kod di atas, output berikut akan dihasilkan

Rearrangement of characters in a string such that no two adjacent are same is: initn
Salin selepas log masuk

Atas ialah kandungan terperinci Susun semula aksara dalam rentetan supaya mana-mana dua aksara bersebelahan berbeza, dilaksanakan dalam C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:tutorialspoint.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan