String 如何将字符串转换为回文,并使字符串的字符删除次数最少?

String 如何将字符串转换为回文,并使字符串的字符删除次数最少?,string,algorithm,String,Algorithm,假设字符串是“anuja”,输出应该是2,因为如果我删除字符“u”和“n”,给定的字符串将变成回文。因此,输出应该是最小的删除次数。 更多示例:输入字符串:“ababa” 输出:0(无需删除) 输入字符串:“abcdba” 输出:1(删除“c”或“d”) 请解释算法。您可以测量从字符串到其反面的编辑距离(levenshtein距离)(忽略替换)。所需值将是该值的一半 这个问题类似于。这是一个例子 示例实现(根据您的情况进行调整)可以是: 字符串P,Q; getline(cin,P); Q=字符串

假设字符串是“anuja”,输出应该是2,因为如果我删除字符“u”和“n”,给定的字符串将变成回文。因此,输出应该是最小的删除次数。 更多示例:输入字符串:“ababa” 输出:0(无需删除) 输入字符串:“abcdba” 输出:1(删除“c”或“d”)
请解释算法。

您可以测量从字符串到其反面的编辑距离(levenshtein距离)(忽略替换)。所需值将是该值的一半

这个问题类似于。这是一个例子

示例实现(根据您的情况进行调整)可以是:

字符串P,Q;
getline(cin,P);
Q=字符串(P.rbegin(),P.rend());
int p=p.size(),q=q.size();

对于(int i=0;iLet
dp[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(每个字符都是回文)