DP方法是否应该添加最小字符数来制作字符串回文?

时间:2015-06-02 14:20:38

标签: c++ algorithm

  

找到使S成为回文所需的最少字符数。例如,如果S = "fft",则应将字符串更改为字符串"tfft",仅添加1个字符。< / p>

现在,我使用dp方法解决了这个问题,如下所示:

  

让给定的输入字符串为S[1.....L]。然后对于输入字符串的任何子串S[i....j],我们可以找到最小插入:

     
      
  • min_insertions(S[i+1 ...... j-1]) [if S[i] is equal to S[j]]
  •   
  • min(min_insertions(S[i+1......j]), min_insertions(S[i....j-1])) + 1
  •   

我将其编码如下:

#include <iostream>

using namespace std;

int dp[100][100];
int main (void)
{
    int n,i,j;
    char arr[100];
    cin>>arr;
    n = strlen(arr);
    //cout<<"You entered the string as "<<arr<<"\n";
    for (i = 0; i < n; i++ )
        dp[i][0] = 0;  
    for ( i = 0; i < n; i++ )
    {
        for ( j = 0; j < n; j++ )
        {
            if (arr[i] == arr[j])
                dp[i][j] = dp[i+1][j-1];
            else 
                dp[i][j] = min(dp[i+1][j],dp[i][j-1])+1;
        }
    //  cout<<dp[0][n-1];
    }
    cout<<dp[0][n-1]<<"\n";
    return 0;
}

然而,这给出了错误的价值。为什么会这样?例如,如果我将字符串输入为abc,则会输出1。这有什么问题?我的逻辑有什么问题吗?

1 个答案:

答案 0 :(得分:0)

您没有按正确的顺序填充数组dp。例如,dp [0] [2]会询问尚未计算的dp [1] [2]。

所以逻辑应该是有一个形式的赋值循环:

for (int i = 0; i <n; i++) {
    for (int h = 0; h < n-i; h++) {
        dp[i][i+h] = .. // your part
    }
}

您还需要对上面h = 0,您不想拨打dp[i+1][i]dp[i][i-1]以及h=1, arr[i]=arr[i+1]的情况更加谨慎你不希望dp[i+1][i]被召唤。