字符串_构造回文字符串

题目描述

给定一个字符串,删去若干个字符后使其成为一个回文字符串,求最少删除字符的数量使其成为一个最长的回文字符串。例如abab这个字符串,最少可以删除一个字符使其称为长度为3的字符串aba或者bab

样例输入

book
abcaba

样例输出

2
1

解题思路

删去若干个字符使字符串变成回文字符串, 意味着去发现字符串中原有的“潜在回文串”,何谓潜在回文串?就是忽略掉中间不相干的字符后就可以变成回文串的部分,即“不连续“的回文串,换句话说,就是回文序列。这样问题就转化为了求一个字符串中最长的回文子序列的问题,于是就可以求这个字符串和它的反串的LCS, 求出这个最大长度后,用字符串原来的长度减去最大长度即为删去最少字符的个数。

参考代码

#include
#include
#include
#include

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;
}

你可能感兴趣的:(算法)