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

C++で文字列内の特別な回文を数える


文字列strが与えられます。目標は、特殊なパリンドロームであり、長さが1より大きいstrのすべてのサブストリングをカウントすることです。特殊なパリンドロームは、すべて同じ文字または中間の文字のみが異なる文字列です。たとえば、文字列が「baabaa」の場合、元の文字列のサブ文字列である特別な回文は「aa」、「aabaa」、「aba」、「aa」です

例を挙げて理解しましょう。

入力 − str =” abccdcdf”

出力 −文字列内の特殊な回文の数は− 3

説明 −特殊なパリンドロームである部分文字列は、−「cc」、「cdc」、「dcd」です

入力 − str =” baabaab”

出力 −文字列内の特殊な回文の数は− 4

説明 −特殊な回文である部分文字列は、−「aa」、「aabaa」、「aba」、「aa」です

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

  • アルファベットの文字列を作成し、その長さを計算します。さらに処理するためにデータを関数に渡します。

  • 一時変数のカウントとiを宣言し、それらを0に設定します

  • 文字列のサイズの配列を作成し、0で初期化します。

  • 文字列の長さより短くなるまでWHILEを開始します

  • while内で、変数をtotalに1に設定し、変数jをi+1に設定します

  • str [i] =str [j]ANDjが文字列の長さよりも小さくなるまで別のWHILEを開始します

  • while内で、合計を1ずつ増やし、jを1ずつ増やします

  • カウントをカウント+(合計*(合計+ 1)/ 2、arr [i]を合計、iをj

    として設定します。
  • 文字列の長さまでjから1までループFORを開始します

  • str [j] =str [j-1]かどうかを確認してから、arr[j]をarr[j-1]

    に設定します。
  • 変数tempをstr[j-1]に設定し、j> 0 ANDj<文字列の長さの1つ少ないANDtemp=str [j + 1] AND sr [j]!=tempかどうかを確認してから、countをcount+として設定します。 min(arr [j-1]、arr [j + 1])

  • カウントをカウントに設定します-文字列の長さ

  • カウントを返す

  • 結果を印刷します。

#include <bits/stdc++.h>
using namespace std;
int count_palindromes(string str, int len){
   int count = 0, i = 0;
   int arr[len] = { 0 };
   while (i < len){
      int total = 1;
      int j = i + 1;
      while (str[i] == str[j] && j < len){
         total++;
         j++;
      }
      count += (total * (total + 1) / 2);
      arr[i] = total;
      i = j;
   }
   for (int j = 1; j < len; j++){
      if (str[j] == str[j - 1]){
         arr[j] = arr[j - 1];
      }
      int temp = str[j - 1];
      if (j > 0 && j < (len - 1) && (temp == str[j + 1] && str[j] != temp)){
         count += min(arr[j-1], arr[j+1]);
      }
   }
   count = count - len;
   return count;
}
int main(){
   string str = "bcbaba";
   int len = str.length();
   cout<<"Count of special palindromes in a String are: "<< count_palindromes(str, len);
   return 0;
}

出力

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

Count of special palindromes in a String are: 3

  1. C++での文字列のインターリーブ

    3つの文字列s1、s2、s3があるとします。次に、s1とs2をインターリーブしてs3が形成されているかどうかを確認します。したがって、文字列が「aabcc」、s2 =「dbbca」、s3が「aadbbcbcac」の場合、結果はtrueになります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これには、s1、s2、s3、および1つの3d配列dp、次にi、j、kが必要です。 i=0かつj=0かつk=0の場合、trueを返します dp [i、j、k]が-1でない場合は、dp [i、j、k]を返します。 ans:=false

  2. C++の2つの文字列で共通のサブシーケンスをカウントします

    2つの文字列が与えられます。たとえば、文字を含むstr1とstr2があり、タスクは両方の文字列の共通のサブシーケンスを計算することです。以下のプログラムでは、動的計画法を使用しています。そのためには、動的計画法とは何か、どのような問題で使用できるかを知る必要があります。 動的計画法のアプローチは、分割統治法に似ており、問題をより小さく、さらにはより小さな可能なサブ問題に分解します。しかし、分割統治とは異なり、これらのサブ問題は独立して解決されません。むしろ、これらの小さなサブ問題の結果は記憶され、類似または重複するサブ問題に使用されます。 動的計画法は、問題が発生した場合に使用されます。問