找到使
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
。这有什么问题?我的逻辑有什么问题吗?
答案 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]
被召唤。