给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
程序运行结果如下:
输出需要删除的字符个数。
本题可转化为动态规划算法求解最长公共子序列问题,然后用总字符串长度减去最长子序列长度,便得出问题的答案。
先将给定的初始字符串S1反过来排列,设为S2,求S1和S2的最长公共子序列便可。C++代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int temp[100][100];
void caculate(string s1){
string s2(s1);
reverse(s2.begin(), s2.end());
int len = s1.length();
memset(temp, 0, sizeof(temp));
for (int i = 0; i<len; ++i)
{
for (int j = 0; j<len; ++j)
{
if (s1[i] == s2[j])
temp[i + 1][j + 1] = temp[i][j] + 1;
else
temp[i + 1][j + 1] = max(temp[i][j + 1], temp[i + 1][j]);
}
}
cout << len - temp[len][len] << endl;
}
int main()
{
string s;
getline(cin, s);
caculate(s);
system("pause");
return 0;
}
程序运行结果如下: