C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++で隣接する2つが同じにならないように、文字列内の文字を再配置します


たとえば、任意の長さの文字列が与えられます。タスクは、結果の文字列に同じ隣接文字が一緒に配置されないように、指定された文字列を再配置することです。

このためのさまざまな入出力シナリオを見てみましょう-

入力 − string str ="itinn"

出力 −隣接する2つが同じにならないように文字列内の文字を再配置するのは、initnです。

説明 −文字列型変数、たとえばstrが与えられます。次に、入力文字列の文字を、同じ位置に2つの同じ文字が出現しないように再配置します。つまり、同じで互いに隣接しているため、「nn」をシフトします。したがって、finalstringは「initn」になります。

入力 − string str ="abbaabbaa"

出力 −隣接する2つが同じにならないように文字列内の文字を再配置するのは、次のとおりです。ababababa

説明 −文字列型変数、たとえばstrが与えられます。ここで、入力文字列の文字を、同じ位置に2つの同じ文字が出現しないように再配置します。つまり、「bb」、「aa」、「bb」、「aa」は同じであり、それぞれに隣接しているため、シフトします。他の。したがって、最後の文字列は「ababababa」になります。

以下のプログラムで使用されているアプローチは次のとおりです

  • 文字列型の変数(たとえば、str)を入力し、文字列のサイズを計算して、variableという名前の長さに格納します。

  • IFの長さが0であることを確認してから、戻ります。

  • データを関数Rearrangement(str、length)に渡します。

  • 関数Rearrangement(arr、length)の内部

    • 文字列のサイズを(長さ+ 1)/2で設定します。

    • 整数型データと文字列型のptrをptr(length、‘‘)として格納するvec(26、0)としてベクトル型変数を宣言します。 0として整数型の一時変数。

    • ループFORを開始して、strを反復処理します。ループ内で、vec [it-‘a’]++を設定します。

    • 文字型変数をchとして作成し、maximum(vec)関数を呼び出して設定します。

    • 整数型変数をtotalとして宣言し、vec [ch-‘a’]で設定します。

    • 合計がサイズより大きいかどうかを確認してから戻ります。

    • 合計中にループを開始し、ptr [temp]をchに設定し、tempをtemp + 2に設定して、合計を1デクリメントします。

    • vec [ch-'a']を0に設定します。ループFORをiから0まで、iが26未満になるまで開始します。ループ内で、vec [i]が0より大きいときに開始します。tempを(temp> =length)に設定しますか? 1:tempおよびptr[temp]を'a' + iに、tempをtemp + 2に変更し、vec[i]を1だけデクリメントします。

    • ptrを返す

  • 関数charmaximum(const vector &vec)

    の内部
    • 整数型変数を0まで、文字型変数を「c」として宣言します

    • ループFORをiから0からiが26未満になるまで開始します。ループ内で、vec [i]がhigh未満であるかどうかを確認し、highをvec [i]に設定し、cを'a'+iに設定します。

    • cを返す

  • 結果を印刷します。

#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 = 'a' + i;
      }
   }
   return c;
}
string Rearrangement(string str, int length){
   int size = (length + 1) / 2;
   vector<int> vec(26, 0);
   string ptr(length, ' ');
   int temp = 0;
   for(auto it : str){
      vec[it - 'a']++;
   }
   char ch = maximum(vec);
   int total = vec[ch - 'a'];
   if(total > size){
      return "";
   }
   while(total){
      ptr[temp] = ch;
      temp = temp + 2;
      total--;
   }
   vec[ch - 'a'] = 0;
   for(int i = 0; i < 26; i++){
      while (vec[i] > 0){
         temp = (temp >= length) ? 1 : temp;
         ptr[temp] = 'a' + 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;
}

出力

上記のコードを実行すると、次の出力が生成されます

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

  1. C++プログラムの動的計画法を使用して2つが隣接しないようなバイナリツリーのノードの最大合計

    この問題では、各ノードに値を持つバイナリツリーが与えられます。私たちのタスクは、2つが隣接しないようにバイナリツリー内のノードの最大合計を見つけるプログラムを作成することです。動的計画法を使用します。 問題の説明 −ノードが直接接続されないように合計が最大になるように、バイナリツリーのサブセットを選択します。 問題を理解するために例を見てみましょう 入力 出力 24 説明 Elements to be taken under consideration are: 8 + 5 + 9 + 2 = 24 ソリューションアプローチ この問題の解決策は、マップを使用して、ノードがmaxS

  2. C++で2つの要素が隣接しないような循環配列の最大合計

    この問題では、循環配列cirArr[]が与えられます。私たちのタスクは、C++で2つの要素が隣接しないように循環配列の最大合計を見つけるプログラムを作成することです。 問題の説明 循環配列の場合、隣接する要素を取得できないように、配列の要素の最大合計を見つける必要があります。つまり、代替要素を取得する必要があります。 循環アレイ は、配列の最後の要素が最初の要素に接続されている特殊なタイプの配列です。 問題を理解するために例を見てみましょう 入力 cirArr[] = {4, 1, 5, 3, 2} 出力 9 説明 最大合計循環サブシーケンスは[4、5、2]です。合計=9 ソリ