在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