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

C++での文字列の最小分割数の後に回文数をカウントするプログラム


小文字の文字列があるとすると、各文字列が回文になるようにできるだけ少ない文字列に分割してから、文字列の数を見つける必要があります。

したがって、入力がs ="levelracecar"のようである場合、2つのパリンドローム"level"と"racecar"があるため、出力は2になります。

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

  • n:=Aのサイズ

  • サイズ(n + 1)の配列結果を定義する

  • 結果[n]:=-1

  • 初期化i:=n --1の場合、i> =0の場合、更新(iを1つ減らす)、実行-

    • result [i]:=n --i --1

    • 初期化j:=iの場合、j

      • 範囲iからjまでのAの部分文字列-iが回文である場合、-

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

          の最小値
  • 結果を返す[0]+1

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   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] + 1;
   }
};
int solve(string s) {
   return (new Solution())->solve(s);
}
int main(){
   string s = "levelracecar";
   cout << solve(s);
}

入力

"levelracecar"

出力

2

  1. C++を使用して文字列の部分文字列の数を見つける

    この記事では、特定の文字列に形成できるサブ文字列(空ではない)の数を見つけるためのアプローチについて学習します。 Input : string = “moon” Output : 10 Explanation: Substrings are ‘m’, ‘o’, ‘o’, ‘n’, ‘mo’, ‘oo’, ‘on’, ‘moo’, ‘oon’ and &

  2. C++で対戦相手を捕まえるために必要な最小ステップ数を見つけるためのプログラム

    [u、v]の形式のツリーエッジのリストがあると仮定します。これは、uとvの間に無向エッジがあることを示します。また、xとyの2つの値があります。ノードxにいて、対戦相手がノードyにいる場合。最初のラウンドでは移動し、次のラウンドでは対戦相手が移動します。対戦相手は、ラウンドで移動しないことを選択できます。対戦相手を捕まえるのに必要な最小ラウンド数を見つける必要があります。 したがって、入力がedges =[[0、1]、[0、2]、[1、3]、[1、4]]、x =0、y =3のような場合、出力は3になります。最初と同じように、ノード0から1に移動します。その後、対戦相手は現在のノード3に留まり