Description:
时间限制:1秒
空间限制:32768K
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda google
输出例子1:
2 2
动态规划Solution:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// same_at_pos[i][j]表示在字符串s1的i位和s2的j位之前两个串的最长公共子序列的长度
int same_at_pos[1001][1001];
int longestSame(string s1, string s2) {
for (int i = 0; i < s1.length(); i++) {
same_at_pos[i][0] = 0;
same_at_pos[0][i] = 0;
}
for (int i = 1; i <= s1.length(); i++) {
for (int j = 1; j <= s2.length(); j++) {
if (s1[i-1] == s2[j-1]) {
same_at_pos[i][j] = same_at_pos[i-1][j-1] + 1;
} else {
same_at_pos[i][j] = max(same_at_pos[i-1][j], same_at_pos[i][j-1]);
}
}
}
return same_at_pos[s1.length()][s2.length()];
}
int main() {
string str;
string reverse_str;
int sameLen = 0;
while (cin >> str) {
reverse_str = str;
// 反转输入的字符串
reverse(reverse_str.begin(), reverse_str.end());
// 求反转后的串与原字符串的最长公共子序列的长度
sameLen = longestSame(str, reverse_str);
// 为了得到最长公共子序列所需要去掉的字母数
cout << str.length() - sameLen << endl;
}
return 0;
}