题目描述
给定一个字符串,删去若干个字符后使其成为一个回文字符串,求最少删除字符的数量使其成为一个最长的回文字符串。例如abab这个字符串,最少可以删除一个字符使其称为长度为3的字符串aba或者bab。
样例输入
book
abcaba
样例输出
2
1
解题思路
删去若干个字符使字符串变成回文字符串, 意味着去发现字符串中原有的“潜在回文串”,何谓潜在回文串?就是忽略掉中间不相干的字符后就可以变成回文串的部分,即“不连续“的回文串,换句话说,就是回文序列。这样问题就转化为了求一个字符串中最长的回文子序列的问题,于是就可以求这个字符串和它的反串的LCS, 求出这个最大长度后,用字符串原来的长度减去最大长度即为删去最少字符的个数。
参考代码
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int size = 1000 + 10;
int DP[size][size];
int LCS(string s, string t){
int len1 = s.length();
int len2 = t.length();
memset(DP, 0, sizeof(DP));
for (int i=1; i<=len1; i++){
for (int j=1; j<=len2; j++){
if (s[i-1] == t[j-1]){
DP[i][j] = DP[i-1][j-1] + 1;
}
else {
DP[i][j] = max(DP[i-1][j], DP[i][j-1]);
}
}
}
return DP[len1][len2];
}
int main(){
string s;
while (cin >> s){
int len;
string t(s);
reverse(t.begin(), t.end());
len = LCS(s, t);
cout << s.length() - len << endl;
}
return 0;
}