[编程题] 构造回文
时间限制:1秒
空间限制:32768K
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda
google
输出例子1:
2
时间限制:1秒
空间限制:32768K
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda
输出例子1:
2
2
还是打算用动态规划做,而且得是二维的
看了牛客大神的方法,感觉简单好多
提到回文串,自然要利用回文串的特点,想到将源字符串逆转后,“回文串”(不一定连续)相当于顺序没变
求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。
#include<iostream>
#include <stdio.h>
#include<string>
#include <vector>
#include<algorithm>
using namespace std;
#define INT_MAX 2147483647
#define MAX 1001
int MaxLen[MAX][MAX];
int maxGong(string s1,string s2)
{
int n1 = s1.length();
int n2 = s2.length();
for(int i = 0 ;i < n1;i ++)
{
MaxLen[i][0] = 0;
}
for(int i = 0;i < n2;i++)
{
MaxLen[0][i] = 0;
}
for(int i = 1;i <= n1;i++)
{
for(int j = 1;j <= n2;j++)
{
if(s1[i-1] == s2[j-1])//说明最后一位匹配
MaxLen[i][j] = MaxLen[i-1][j-1] + 1;
else
{
int t1 = MaxLen[i-1][j];
int t2 = MaxLen[i][j-1];
if(t1 > t2)
MaxLen[i][j] = t1;
else
MaxLen[i][j] = t2;
}
}
}
return MaxLen[n1][n2];
}
int main()
{
string str;
while(cin>>str)
{
string str1 = str;
reverse(str1.begin(),str1.end());
int n = str.length();
cout<<n-maxGong(str,str1)<<endl;
}
return 0;
}