字串_構造迴文字串
阿新 • • 發佈:2019-02-10
題目描述
給定一個字串,刪去若干個字元後使其成為一個迴文字串,求最少刪除字元的數量使其成為一個最長的迴文字串。例如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;
}