C ++中的有效Palindrome III

假设我们有一个字符串s和另一个数字k;我们必须检查给定的字符串是否为K回文。

如果字符串最多可以删除k个字符,则可以将其称为回文式。

因此,如果输入像s =“ abcdeca”,k = 2,则输出将为真,因为删除了'b'和'e'字符,这将是回文。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数lcs(),它将花费s,t,

  • n:= s的大小

  • 在s之前添加一个空格

  • 在t之前添加一个空格

  • 定义一个大小为(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]与t [j]相同,则-

    • dp [i,j]:= dp [i,j]和1 + dp [i-1,j-1]的最大值

    • 对于初始化j:= 1,当j <= n时,更新(j增加1),-

    • 返回dp [n,n]

    • 从主要方法中执行以下操作-

    • 如果不是s的大小,则-

      • 返回真

    • x:=空白

    • 对于初始化i:= s的大小,当i> = 0时,更新(将i减1),执行-

      • x:= x + s [i]

    • s的返回大小

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int lcs(string s, string t){
          int n = s.size();
          s = " " + s;
          t = " " + t;
          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] == t[j])
                dp[i][j] = max(dp[i][j], 1 + dp[i - 1][j - 1]);
             }
          }
          return dp[n][n];
       }
       bool isValidPalindrome(string s, int k) {
          if (!s.size())
          return true;
          string x = "";
          for (int i = s.size() - 1; i >= 0; i--)
             x += s[i];
          return s.size() - lcs(s, x) <= k;
       }
    };
    main(){
       Solution ob;
       cout << (ob.isValidPalindrome("abcdeca", 2));
    }

    输入项

    "abcdeca", 2

    输出结果

    1