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

C++でのパリンドロームパーティショニングII


文字列sがあるとすると、この文字列を異なるサブ文字列に分割するために必要なカット数を見つける必要があり、各部分は回文です。したがって、弦が「ababba」のようなものである場合、これは2カットかかります。 [aba | bb | a]

これを解決するには、次の手順に従います-

  • n:=文字列内の文字数s

  • サイズn+1

    のresという1つの配列を作成します
  • res [n]:=-1

  • n –1から0までの範囲のiの場合

    • res [i]:=n – i – 1

    • iからnの範囲のjの場合

      • インデックスiからjまでのaの部分文字列– iが回文である場合、

        • res [i]:=res[i]と1+res [j + 1]

          の最小値
  • res [0]

    を返します

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string A) {
   int left = 0;
   int right = A.size()-1;
   while(left < right) {
      if(A[left] != A[right]) {
         return 0;
      }
      left++;
      right--;
   }
   return 1;
}
int solve(string A) {
   int n = A.size();
   vector<int>result(n+1);
   result[n] = -1;
   for(int i=n-1;i>=0;i--) {
      result[i] = n-i-1;
      for(int j=i;j<n;j++) {
         if(isPalindrome(A.substr(i, j-i+1))) {
            result[i] = min(result[i], 1 + result[j+1]);
         }
      }
   }
   return result[0];
}
class Solution {
   public:
   int minCut(string s) {
      return solve(s);
   }
};
main(){
   Solution ob;
   cout << (ob.minCut("ababba"));
}

入力

“ababba”

出力

2

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

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

  2. 数値がC++の回文であるかどうかを確認します

    ここでは、番号が回文であるかどうかを確認する方法を説明します。回文数は両方向で同じです。たとえば、番号12321は回文ですが、12345は回文ではありません。 ロジックは非常に単純です。数を逆にする必要があります。逆の数が実際の数と同じである場合、それは回文です。そうでない場合はそうではありません。より良いアイデアを得るためのアルゴリズムを見てみましょう。 アルゴリズム isPalindrome(n)- 入力 −数n 出力 −数値が回文の場合はtrue、それ以外の場合はfalse begin    temp := n    rev :=