1.
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
解析:将字符串s逆置得到字符串t,根据回文串的特点,s和t的最长公共子序列就是最长回文串。
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include <algorithm>
using namespace std;
int longestCommonSubsequence(string s, string t) {
int n = s.size();
int m = t.size();
vector<vector<int>> f(n+1,vector<int>(m+1,0));
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(s[i-1] == t[j-1]) {
f[i][j] = f[i-1][j-1]+1;
} else {
f[i][j] = max(f[i-1][j],f[i][j-1]);
}
}
}
return f[n][m];
}
int main () {
string s;
while(cin>>s) {
string t = s;
reverse(t.begin(),t.end());
int commonlength = longestCommonSubsequence(s,t);
cout<<s.size()-commonlength<<endl;
}
return 0;
}