Leetcode 5.最长回文字串
题目描述:给你一个字符串 s,找到 s 中最长的回文子串。
这道题先使用接龙型动态规划,但时间复杂度超了。然后参考了解析,使用了坐标型动态规划,新开一个二维数组f[n][n],这里f[i][j]表示s[i]~s[j]的子字符串是否为回文串,若是f[i][j]=true,否则为false。然后维持一个最长的子串。
判断是否为回文串时,利用特点:对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。
class Solution {
public:
string longestPalindrome(string s) {
if (1 >= s.length()) {
return s;
}
//1. 新开一个二维数组,f[i][j]表示s[i]~s[j]的子字符串是否为回文串,
//若是f[i][j]=true,否则为false
vector<vector<bool> > f(s.length(), vector<bool>(s.length()));
string result = "";
//2. 状态转移
for (int len = 0; len < s.length(); ++len) {
for (int i = 0; i + len < s.length(); ++i) {
int j = i + len;//子字符串两端
if (0 == len) {
f[i][j] = true;//边界情况1
} else if (1 == len) {
f[i][j] = (s[i] == s[j]);//边界情况2
} else {
f[i][j] = (f[i + 1][j - 1] && s[i] == s[j]);//转移方程
}
//3. 答案
if (f[i][j] && len + 1 > result.length()) {
result = s.substr(i, len + 1);
}
}
}
return result;
}
};