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

C ++で可能であれば、文字を再配置して回文を形成します


任意の長さの文字列「str」が与えられます。タスクは、指定された入力文字列に文字を追加または削除せずに、出力が回文文字列になるように文字を再配置することです。回文文字列は、文字が最初から最後まで同じように発音されるように配置された文字列です。

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

入力 − string str ="itnin"

出力 −可能であれば、回文を形成するための文字の再配置は次のとおりです。nitin

説明 −文字列型変数、たとえばstrが与えられます。次に、入力文字列の文字を回文文字列になるように再配置します。不可能な場合は、「NOTPOSSIBLE」を返します。したがって、指定された入力文字列を使用した出力は「nitin」です。

入力 − string str ="baaaba"

出力 −可能であれば、回文を形成するための文字の再配置は次のとおりです。aabbaa

説明 −文字列型変数、たとえばstrが与えられます。次に、入力文字列の文字を回文文字列になるように再配置します。それが不可能な場合は、「NOTPOSSIBLE」を返します。したがって、指定された入力文字列を使用した出力は「aabbaa」です。

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

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

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

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

    • char型とinteger型のペアを格納しているunordered_map型の「um」として変数を作成します。

    • 整数型変数をtotalとして宣言し、0に設定します。

    • 文字型変数を「ch」として作成し、文字列型変数をstr_1およびstr_2として作成します。

    • iが長さより小さくなるまで、ループFORをiから0まで開始します。ループ内で、um[str[i]]を増分値1で設定します。

    • ループFORを開始して、マップ「um」を繰り返します。ループ内で、if it.second%2が0に等しくないことを確認してから、合計を1ずつ増やし、それを使用してchを設定します。

    • 合計が1より大きいか、合計=1で、長さが%2 =0であるかを確認してから、0を返します。

    • ループFORを開始して、マップ「um」を繰り返します。ループ内で、str(it.second / 2、it.first)、str_1をstr_1 + strに、str_2をstr+str_2に設定します。

    • IF total =1を確認してから、str_1 + ch+str_2を返します。それ以外の場合は、str_1+str_2を返します。

  • 結果を印刷します。

#include <bits/stdc++.h>
using namespace std;
string Rearrangement(string str, int length){
   unordered_map<char, int> um;
   int total = 0;
   char ch;
   string str_1 = "";
   string str_2 = "";

   for (int i = 0; i < length; i++){
      um[str[i]]++;
   }
   for(auto it : um){
      if(it.second % 2 != 0){
         total++;
         ch = it.first;
      }
   }
   if(total > 1 || total == 1 && length % 2 == 0){
      return 0;
   }
   for(auto it : um){
      string str(it.second / 2, it.first);
      str_1 = str_1 + str;
      str_2 = str + str_2;
   }
   if(total == 1){
      return str_1 + ch + str_2;
   }
   else{
      return str_1 + str_2;
   }
}
int main(){
   string str = "itnin";
   int length = str.size();
   cout<<"Rearrangement of characters to form palindrome if possible is: "<<Rearrangement(str, length);
   return 0;
}

出力

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

Rearrangement of characters to form palindrome if possible is: nitin

  1. 特定の文字列がC++の回文の回転であるかどうかを確認します

    ここでは、特定の回転後の1つのストリングが回文であることがわかります。回文は、両方向で同じ文字列です。それがAAAADのようなものである場合、弦の回転は回文です。これは直接の回文ではありませんが、そのローテーションAADAAは回文です。 文字列が回文で回転しているかどうかを確認するには、最初にこれが回文であるかどうかを確認し、その後、1文字ずつ回転させてから、もう一度確認します。この確認はn回実行されます。ここでnは文字数です。 例 #include <iostream> #include <string> #include <algorithm> usi

  2. C#での文字列の文字の交換

    文字列の文字を入れ替えるには、Selectメソッドを使用します。 まず、文字列が-であるとしましょう string str = "PQRQP"; ここで、Pのすべての出現をQと交換し、QをPと交換する必要があります- str.Select(a=> a == 'P' ? 'Q' : (a=='Q' ? 'P' : a)).ToArray(); 上記は文字を置き換えます。 競合コードを見てみましょう- 例 using System; using System.Linq; public class P