Leetcode5. 最长回文子串
思路:回文串的判断
回文串的长度分为两种,一种奇数个,一种偶数个
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
string str;
for (int i = 0; i < n; i ++ ) {
int l = i - 1, r = i + 1;
while (l >= 0 && r < n && s[l] == s[r]) l -- , r ++ ;
if (r - l - 1 > str.size()) str = s.substr(l + 1, r - l - 1);
l = i, r = i + 1;
while (l >= 0 && r < n && s[l] == s[r]) l -- , r ++ ;
if (r - l - 1 > str.size()) str = s.substr(l + 1, r - l - 1);
}
return str;
}
};
Leetcode516. 最长回文子序列
思路:动态规划
集合表示:f[i][j]
表示从
i
i
i到
j
j
j区间内最长回文子序列长度
状态转移:是否选择i
和j
两个元素,如果s[i]==s[j]
,f[i][j]=f[i+1][j-1]+2
;否则f[i][j]=max(f[i][j],f[i+1][j],f[i][j-1])
特别地,如果i==j
,f[i][i]=1
class Solution {
public:
int longestPalindromeSubseq(string s) {
int n = s.size();
vector<vector<int>> f(n, vector<int>(n));
for (int len = 1; len <= n; len ++ ) {
for (int i = 0; i + len - 1 < n; i ++ ) {
int j = i + len - 1;
if (len == 1) f[i][i] = 1;
else {
if (s[i] == s[j])
f[i][j] = f[i + 1][j - 1] + 2;
f[i][j] = max(f[i][j], max(f[i + 1][j], f[i][j - 1]));
}
}
}
return f[0][n - 1];
}
};