在C ++中制作字符串回文符的最少插入步骤
假设我们有一个字符串s,我们必须使这个字符串回文。在每个步骤中,我们都可以在任何位置插入任何字符,我们必须找到进行此回文的最低字符数。如果字符串像“mad”,那么答案将是2,因为我们可以在“mad”之前添加“da”,或在“mad”之后添加“am”来创建此回文。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数lcs(),需要s,x:=s
n:=s的大小
反转字符串x
s:=连接s之前的空间,x:=连接x之前的空间
定义一个大小为(n+1)x(n+1)的2D数组dp
对于初始化i:=1,当i<=n时,更新(将i增加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),-
返回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