腾讯2017
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda google 输出例子1:
2 2
这个问题等价于最长回文子序
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int longestPalindromeSubseq(string &s) {
int n = s.size();
// dp[i][j] 表示下标从i到j的最长回文子序列的长度,下标从0开始
vector<vector<int>> dp(n, vector<int>(n, 0));
for (int i = 0; i < n; i++)
dp[i][i] = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < n - i; j++) {
if (s[j] == s[j + i])
dp[j][j + i] = dp[j + 1][j + i - 1] + 2;
else
dp[j][j + i] = max(dp[j + 1][j + i], dp[j][j + i - 1]);
}
}
return dp[0][n - 1];
}
int main()
{
string str;
cin >> str;
cout << longestPalindromeSubseq(str) << endl;
}
快手这道题目就是最长回文子序列
最大回文子串是被研究得比较多的一个经典问题。最近月神想到了一个变种,对于一个字符串,如果不要求子串连续,那么一个字符串的最大回文子串的最大长度是多少呢。
输入描述:
每个测试用例输入一行字符串(由数字0-9,字母a-z、A-Z构成),字条串长度大于0且不大于1000.
输出描述:
输出该字符串的最长回文子串的长度。(不要求输出最长回文串,并且子串不要求连续)
示例1
输入
adbca
输出
3
说明
因为在本题中,不要求回文子串连续,故最长回文子串为aba(或ada、aca)