C++で文字列回文を作成するための最小挿入手順
文字列sがあるとすると、この文字列回文を作成する必要があります。各ステップで、任意の位置に任意の文字を挿入できます。この回文を作成するために必要な最小数の文字を見つける必要があります。文字列が「mad」のような場合、「mad」の前に「da」を追加したり、「mad」の後に「am」を追加してこの回文を作成したりできるため、答えは2になります。
これを解決するには、次の手順に従います-
- 関数lcs()を定義します。これにはs、x:=sが必要です
- n:=sのサイズ
- 文字列xを逆にします
- s:=sの前にスペースを連結し、x:=xの前にスペースを連結します
- サイズ(n + 1)x(n + 1)の2D配列dpを1つ定義します
- iを初期化する場合:=1、i <=nの場合、更新(iを1つ増やす)、実行-
- jを初期化する場合:=1、j <=nの場合、更新(jを1つ増やす)、実行-
- dp [i、j]:=最大dp [i – 1、j]およびdp [i、j-1]
- s[i]がx[j]と同じ場合、-
- dp [i、j]:=最大dp [i、j]およびdp [i – 1、j-1] + 1
- jを初期化する場合:=1、j <=nの場合、更新(jを1つ増やす)、実行-
- return dp [n、n]
- メインメソッドからs– lcs(s)の戻りサイズ
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: int lcs(string s){ string x = s; int n = s.size(); reverse(x.begin(), x.end()); s = " " + s; x = " " + x; vector < vector <int> > dp(n + 1, vector <int>(n + 1)); for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); if(s[i] == x[j]){ dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1); } } } return dp[n][n]; } int minInsertions(string s) { return s.size() - lcs(s); } }; main(){ Solution ob; cout << (ob.minInsertions("mad")); }
入力
“mad”
出力
2
-
C ++ですべての文字列を等しくするための、操作を終了するための最小限の移動
問題の説明 互いに順列であるn個の文字列が与えられます。文字列の最初の文字を文字列の最後に移動する操作で、すべての文字列を同じにする必要があります。 例 arr [] ={“ abcd”、“ cdab”}の場合、2回の移動が必要です。 最初の文字列「abcd」を見てみましょう。文字「a」を文字列の最後に移動します。この操作の後、文字列は「bcda」になります 次に、文字「b」を文字列の最後に移動します。この操作の後、文字列は「cdab」になります。これにより、両方の文字列が等しくなります アルゴリズム 最初の文字列を取得します。これを「str1」と呼びましょう。 次のようにstr
-
C++で文字列回文を作成するための削除の最小数。
問題の説明 サイズ「n」の文字列が与えられます。タスクは、文字列回文を作成するために最小数の文字を削除することです。 指定された文字列が「abcda」の場合、最初と最後を除く任意の2文字を削除して、回文にすることができます。 文字「b」と「c」を削除すると、「ada」文字列は回文になります 文字「c」と「d」を削除すると、「aba」文字列は回文になります 文字「b」と「d」を削除すると、「aca」文字列は回文になります アルゴリズム 1. Find longest palindromic subsequence of given string. Let’s