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

C++でのすべてのサフィックスを持つ文字列の類似性の合計


この問題では、文字列strが与えられます。私たちのタスクは、文字列とそのすべてのサフィックスの類似性の合計を見つけるプログラムを作成することです。

文字列strのサフィックスは、文字列の開始文字を削除して作成されたすべての文字列です。

文字列の類似点 str1とstr2は、両方の文字列に共通する最長のプレフィックスの長さです。たとえば、str1 =‘abbac’およびstr2 =‘abb’は3です。

str1 =‘abca’およびstr2 =‘ca’は0です。最初から数えます。

問題を理解するために例を見てみましょう

入力 − str =‘xyxyx’

出力

説明 −すべての部分文字列とすべての接尾辞を持つ文字列の類似点は-

‘xyxyx’ -> 5
‘yxyx’ -> 0
‘xyx’ -> 3
‘yx’ -> 0
‘x’ -> 1
Sum = 5 + 0 + 3 + 0 + 1 = 9

この問題を解決するために、Zアルゴリズムを使用してZ配列を計算します。 Z配列は、文字列の長さに等しい長さの配列です。すべての要素はstrのプレフィックスを格納します。以下のプログラムは実装を示しています

#include <bits/stdc++.h>
using namespace std;
void createZArray(string str, int n, int Zarray[]) {
   int L, R, k;
   L = R = 0;
   for (int i = 1; i < n; ++i) {
      if (i > R) {
         L = R = i;
         while (R < n && str[R - L] == str[R])
            R++;
         Zarray[i] = R - L;
         R--;
      }
      else {
         k = i - L;
         if (Zarray[k] < R - i + 1)
         Zarray[i] = Zarray[k];
         else {
            L = i;
            while (R < n && str[R - L] == str[R])
            R++;
            Zarray[i] = R - L;
            R--;
         }
      }
   }
}
int calSumSimilarities(string s, int n) {
   int Zarray[n] = { 0 };
   createZArray(s, n, Zarray);
   int total = n;
   for (int i = 1; i < n; i++)
      total += Zarray[i];
   return total;
}
int main() {
   string s = "xyxyx";
   int n = s.length();
   cout<<"Sum of similarities of string with all of its suffixes is "<<calSumSimilarities(s, n);
   return 0;
}

出力

Sum of similarities of string with all of its suffixes is 9

  1. 文字列のすべての回文順列をC++で出力します

    この問題では、文字列が与えられ、その文字列の文字から可能なすべての回文順列を印刷する必要があります。 問題を理解するために例を見てみましょう- 入力- string =‘aabb’ 出力- アババーブ この問題を解決するには、文字列の文字を取得し、これらの文字を使用してすべての回文文字列を1つずつ生成する必要があります。 ステップ1 −文字列が回文であるかどうかを確認し、「不可能」と印刷します。 ’でない場合。 ステップ2 −回文を作成できる場合は、半分にして、辞書式順序で文字列の各文字を選択します。 ステップ3 −作成された順列をトラバースし、偶数の長さの文字列の場合は半分を反

  2. C++で文字の繰り返しを含むすべての順列を出力します

    この問題では、n文字の文字列が与えられ、文字列の文字のすべての順列を出力する必要があります。文字列の文字の繰り返しは許可されています。順列の印刷は、アルファベット順(辞書式順序)で実行する必要があります。 トピックをよりよく理解するために例を見てみましょう: 入力- XY 出力- XX、XY、YX、YY この問題を解決するには、修正と繰り返しのロジックを使用する必要があります。ここでは、配列の最初のインデックスで1つの要素を修正してから、シーケンス内の次の要素を再帰的に呼び出します。 ソリューションを明確にする実装例を見てみましょう。 文字列XYを入力します。 1つのインデック