String 如何将字符串转换为回文,并使字符串的字符删除次数最少?
假设字符串是“anuja”,输出应该是2,因为如果我删除字符“u”和“n”,给定的字符串将变成回文。因此,输出应该是最小的删除次数。 更多示例:输入字符串:“ababa” 输出:0(无需删除) 输入字符串:“abcdba” 输出:1(删除“c”或“d”)String 如何将字符串转换为回文,并使字符串的字符删除次数最少?,string,algorithm,String,Algorithm,假设字符串是“anuja”,输出应该是2,因为如果我删除字符“u”和“n”,给定的字符串将变成回文。因此,输出应该是最小的删除次数。 更多示例:输入字符串:“ababa” 输出:0(无需删除) 输入字符串:“abcdba” 输出:1(删除“c”或“d”) 请解释算法。您可以测量从字符串到其反面的编辑距离(levenshtein距离)(忽略替换)。所需值将是该值的一半 这个问题类似于。这是一个例子 示例实现(根据您的情况进行调整)可以是: 字符串P,Q; getline(cin,P); Q=字符串
请解释算法。您可以测量从字符串到其反面的编辑距离(levenshtein距离)(忽略替换)。所需值将是该值的一半 这个问题类似于。这是一个例子 示例实现(根据您的情况进行调整)可以是:
字符串P,Q;
getline(cin,P);
Q=字符串(P.rbegin(),P.rend());
int p=p.size(),q=q.size();
对于(int i=0;iLetdp[i,j]=将子字符串[i,j]转换为回文所需的最小删除次数。我们有:
dp[i, i] = 0 for all i (every single character is a palindrome)
查找<代码> dp[i,j] < /代码>,让我们考虑一个随机字符串。我们有两种可能性:
第一个字符和最后一个字符是相等的:a[i]==a[j]
。在这种情况下,我们可以将问题简化为找到需要删除的最小字符数,以使子字符串[i+1,j-1]
成为回文
第一个字符和最后一个字符不相等:a[i]!=a[j]
。在这种情况下,我们需要删除其中一个字符。我们将删除这些字符,从而找到更好的解决方案
因此,我们:
dp[i, j] = dp[i + 1, j - 1] # if a[i] == a[j]
min(dp[i + 1, j], dp[i, j - 1]) + 1 # otherwise
对于您的anuja
,我们将得到:
| 1 2 3 4 5
-------------
1 | 0 1 2 2 2
2 | 0 1 2 3
3 | 0 1 2
4 | 0 1
5 | 0
请注意,矩阵的计算从主对角线开始,然后依次向上,对角线与主对角线平行。答案是dp[1,n]
这类似于,但它只考虑删除。问题很好。到目前为止您尝试了什么,解决方案的问题在哪里?在链接到的问题中,您可以添加、删除和替换字符。在这里,您只能删除字符。为什么问题相同?@IVlad您是对的,尽管添加和删除操作相同n从不同的角度来看。那么这只是从循环中删除T[i-1][j-1]的问题,但你在回答中已经这样做了。我将把这个答案留在这里,因为我认为计算字符串与其反面之间的编辑距离的原理是有用的:)@Juan Lopes..谢谢你的回答。。这很有帮助。@Khushboo如果有答案回答了您的问题,请单击其左侧的勾号将其标记为已接受。如果您愿意,也可以通过单击同一位置的向上箭头(^
)将其向上投票。如果您不知道dp[i][j],您如何计算dp[i+1][j]您可以解释下表中的0吗diagonal@BaradwajAryasomayajuladp[i,i]=0表示所有i(每个字符都是回文)