时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda google
输出例子1:
2 2
思路:原先字符串逆序在和原先的字符串求最长公共子序列
#include<bits/stdc++.h>
using namespace std;
int dp[1010][1010];
string ret(string a)
{
string b;
for(int i=a.size()-1;i>=0;i--)
{
b+=a[i];
}
return b;
}
void dpp(string a,string b)
{
for(int i=0; i<a.size(); i++)
{
for(int j=0; j<b.size(); j++)
{
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
if(a[i]==b[j])
{
dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+1);
}
}
}
cout<< a.size()-dp[a.size()][b.size()]<<endl;
}
int main()
{
string ai;
while(cin>>ai)
{
memset(dp,0,sizeof(dp));
dpp(ai,ret(ai));
}
}