暴力
class Solution { struct Node { int begin; int end; int len; }; bool ispalin(const string &s, int left, int right) { while(left < right) { if(s[left++] != s[right--]) return false; } return true; } public: string longestPalindrome(string s) { int n = s.size(); struct Node ans; ans.len = 0; int i, j; for(i=0; i<n; i++) { for(j=n-1; j>=i; j--) { if(j-i+1 > ans.len && ispalin(s, i, j)) { ans.begin = i; ans.end = j; ans.len = j-i+1; break; } } } string res = s.substr(ans.begin, ans.len); return res; } };
动态规划:
d[i][j]标识s串i到j是回文串。判断d[i][j],只需满足s[i]=s[j],切d[i][j]=true
class Solution { struct Node { int begin; int end; int len; }; public: string longestPalindrome(string s) { int n = s.size(); if(n == 0) return ""; struct Node ans; bool d[1086][1086] = {false}; ans.len = 1; ans.begin = ans.end = 0; int i, j; for(i=n-1; i>=0; i--) { d[i][i] = true; for(j=i+1; j<n; j++) { if(s[i] == s[j] && (j-i <= 2 || d[i+1][j-1])) { d[i][j] = true; if(j-i+1 > ans.len) { ans.begin = i; ans.end = j; ans.len = j-i+1; string res = s.substr(ans.begin, ans.len); } } } } string res = s.substr(ans.begin, ans.len); return res; } };