题目链接Longest Palindromic Substring
这道题是求最大回文子串。
用动态规划来解决的话,其中一个状态转移方程为
// dp(i,j)表示字符串s的子串s[i,j]是否为回文串
// 对于j > i - 1
if s[i] == s[j] then dp(i,j) = dp(i+1, j-1)
// 对j == i - 1 或 j == i处理比较简单
// 在处理过程中可以记录最大长度和子串的起始下标。
c++代码如下
class Solution {
public:
string longestPalindrome(string s){
int len = s.length();
int begin = 0;
int maxlen = 1;
vector<vector<bool> > dp = vector<vector<bool> >(len,vector<bool>(len,false));
for(int j = 0; j < len; j++){
for(int i = j; i >= 0; i--){
if(i == j){
dp[i][j] = true;
}else if(j == i + 1){
if(s[j] == s[i]){
dp[i][j] = true;
//更新最大长度和起始下标
if(maxlen < j - i + 1){
begin = i;
maxlen = j - i + 1;
}
}
}else {
if(s[j] == s[i]){
dp[i][j] = dp[i+1][j-1];
if(dp[i][j]){
if(maxlen < j - i + 1){
begin = i;
maxlen = j - i + 1;
}
}
}
}
}
}
return s.substr(begin, maxlen);
}
};
可见复杂度是 O(n2) 的,能够accept但是排名靠后。毕竟还有 O(n) 的解法。