题目:
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda
google
输出例子1:
2
2
代码:
#include<string>
using namespace std;
int main()
{
string str1;
while(cin >> str1)
{
string str2 = "";
int length = str1.length();
for(int i = length - 1; i >= 0; --i)
{
str2 += str1[i];
}
int **matrix = new int*[length + 1];
for(int i = 0; i < length + 1; ++i)
{
matrix[i] = new int[length + 1];
}
// int matrix[1000][1000];
for(int i = 0; i < length + 1; ++i)
{
matrix[i][0] = 0;
matrix[0][i] = 0;
}
for(int i = 1; i < length + 1; ++i)
{
for(int j = 1; j < length + 1; ++j)
{
if(str1[i - 1] == str2[j - 1])
{
matrix[i][j] = matrix[i-1][j-1] + 1;
}
else
{
matrix[i][j] = (matrix[i - 1][j] >= matrix[i][j - 1] ? matrix[i - 1][j] : matrix[i][j - 1]);
}
}
}
int l = length - matrix[length][length];
for(int i = 0; i < length; ++i)
delete [] matrix[i];
delete [] matrix;
cout << l << endl;
}
return 0;
}
总结:
时间长没有在牛客网上刷题了,刚拿到这个题的时候我有点懵逼。哎,还是要多练习呀!!!!!
下面说一说做题过程中遇到的问题吧。
1、首先要强调的一点,也是很重要的一点:牛客网上大多数题都要求多个输入。当然我也是在这个方面碰壁了。
刚开始看题,我也看到了多组输入,但是我想先写个针对一组的程序,然后外面加一个while(cin>>a){}就行了。但是当我写完程序后牛客网的系统提示我一个测试用例页面没有通过,我还以为是程序出了问题,然后我把程序考到本地编译器VS2013运行,结果对呀!!!!但是为什么牛客网提示一个测试用例也没有通过呢????
我纳闷了很久,还以为是牛客网编译器不支持某些库函数,我就在找,,,,,找了好久不耐烦了。我就把while循环加上去,一下子就通过了。这也算是一个大坑!!吃了很大亏,幸好这只是练习,如果正规笔试书在这方面感觉太不值了。所以以后要直接处理多个输入用例的情况。
2、下面说一说这个题:
思路:所谓“字符串回文”就是对称的字符串如“abccba”就是一个回文字符串。“abcwejfkcmba”其中的abc这个串中的回文结构。
那么如果要找一个字符串的最长回文结构,可以将原来的串颠倒过来,求原串与颠倒后的串的LCS(最长公共子序列长度)。这就相当于使用DM求两个字符串X和Y的LCS长度问题。借助于一个二维数组c[n+1][n+1],其中c[i][j]是Xi和Yj的LCS长度。
状态转移方程为:
3、知识点
二维数组动态开辟内存(5行10列)
int **p = new int*[5];
for(int i = 0; i < 5; ++i)
{
p[i] = new int[10];
}
释放new创建的二维数组
for(int i = 0; i < 5; ++i)
{
delete [] p[i];
}
delete [] p;