假设我们有一个字符串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
本文向大家介绍在C ++中制作两个不带字符删除的两个字符串字谜所需的最少操作数,包括了在C ++中制作两个不带字符删除的两个字符串字谜所需的最少操作数的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个长度相等的字符串,我们必须找到使两个字符串相符的最小数目的更改,而不删除任何字符。字谜是两个具有相同字符集的字符串。假设两个字符串为“ HELLO”和“ WORLD”,此处需要更改的数目为3,因
我如何在O(N**2)个时间内完成它?
005.Longest Palindromic [M] 题目 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic subst
问题内容: 尝试将变量插入回显的字符串中。上面的代码不起作用。如何将php变量迭代到回显字符串中? 问题答案: 单引号不会解析其中的PHP变量。使用双引号或使用点扩展回声。 要么 在您的情况下: 要么
在JAVA上下文中,插入字符串的含义是什么?String类中的intern()方法是什么?我最近遇到一个代码 输出的参数是字符串文本被扣押的事实。
在普通字符串中,我可以用反斜杠转义: 在字符串文字中有可能做同样的事情吗?反斜杠不再是转义字符: 到目前为止,我看到的唯一解决方案是字符串连接,这非常难看,以及嵌套插值,这开始变得有点可笑: