ホームページ  >  記事  >  バックエンド開発  >  隣接する 2 つの文字が異なるように文字列内の文字を再配置します。C++ で実装されています。

隣接する 2 つの文字が異なるように文字列内の文字を再配置します。C++ で実装されています。

WBOY
WBOY転載
2023-08-26 22:37:19755ブラウズ

隣接する 2 つの文字が異なるように文字列内の文字を再配置します。C++ で実装されています。

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

さまざまな入出力シナリオを見てみましょう:

入力 - String str = "itinn"

出力 -隣接する 2 つの文字が異なるように文字列内の文字を並べ替えます。結果は次のようになります: initn。

説明 - 文字列型の変数が str であると仮定して与えられます。ここで、同じ位置に 2 つの同一の文字が表示されないように、入力文字列の文字を再配置します。つまり、「nn」を隣接しない位置に移動します。最終的な結果は次のとおりです 文字列は 'initn' になります。

Input - String str = "abbaabbaa"

Output - string 内の文字を並べ替えて、次のようにします。隣接する文字が異なります: ababababa

説明 - str であると仮定して、文字列型の変数が与えられます。次に、2 つの同じ文字が同じ位置に表示されないように、入力文字列の文字を再配置します。つまり、これらは同じで隣接しているため、'bb'、'aa'、'bb'、'aa' を移動します。したがって、最後の文字列は「ababababa」になります。

以下のプログラムで使用するメソッドは次のとおりです。

  • 文字列型の変数を str として入力し、文字列のサイズを計算して格納します。名前は長さの変数です。

  • 長さが 0 であるかどうかを確認してから戻ります。

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

  • 関数内 Rearrangement(arr, length)

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

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

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

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

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

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

    • total WHILE でループを開始し、ptr[temp] を ch に設定し、temp を temp 2 に設定し、total を 1 減らします。

    • vec[ch - 'a'] を 0 に設定します。 i が 26 未満になるまで、i から 0 まで FOR のループを開始します。ループ内で while ループを開始し、vec[i] が 0 より大きい場合、temp を (temp >= length) ? 1: temp に設定し、ptr[temp] を 'a' i に設定し、temp を temp 2 に設定します。 、vec[i]を1減算します。

    • #Return ptr

  • 関数内 char minimum(const Vector& vec)

    • 整数型変数 high を宣言して 0 に設定し、文字型変数 c を宣言します。

    • i が 26 未満になるまで、i から 0 まで FOR のループを開始します。ループ内で、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 = &#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;
}

出力

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

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

以上が隣接する 2 つの文字が異なるように文字列内の文字を再配置します。C++ で実装されています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

関連記事

続きを見る