1. 程式人生 > >字串_構造迴文字串

字串_構造迴文字串

題目描述

給定一個字串,刪去若干個字元後使其成為一個迴文字串,求最少刪除字元的數量使其成為一個最長的迴文字串。例如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; }