1 /* 2 * DP 3 * 4 * d[i][j] represents the length of longest Palindromic 5 * substring of s[i...j]. 6 * 7 * |- j-i+1 (s[i] == s[j] && s[i+1...j-1] is Palindrome) 8 * d[i][j] = | 9 * |- max{ d[i+1][j], d[i][j-1] } 10 * 11 * Note: use circular array. 12 */ 13 14 #include <string> 15 #include <iostream> 16 using namespace std; 17 18 class Solution { 19 public: 20 string longestPalindrome(string s) { 21 // Start typing your C/C++ solution below 22 // DO NOT write int main() function 23 int len = s.length(); 24 25 int d[3][1000]; 26 int st[3][1000]; 27 for(int i=0; i<len; i++){ 28 d[1][i] = 1; 29 st[1][i] = i; 30 } 31 32 int idx2 = 2, idx1 = 1, idx0 = 0; 33 // DP 34 for(int l=2; l<=len; l++){ 35 for(int i=0; i<=len-l; i++){ 36 if(s[i] == s[i+l-1] && (l == 2 || d[idx0][i+1] == l-2)){ 37 d[idx2][i] = l; 38 st[idx2][i] = i; 39 } 40 else if(d[idx1][i+1] > d[idx1][i]){ 41 d[idx2][i] = d[idx1][i+1]; 42 st[idx2][i] = st[idx1][i+1]; 43 } 44 else{ 45 d[idx2][i] = d[idx1][i]; 46 st[idx2][i] = st[idx1][i]; 47 } 48 } 49 idx2 = (idx2 + 1) % 3; 50 idx1 = (idx1 + 1) % 3; 51 idx0 = (idx0 + 1) % 3; 52 53 } 54 55 s[st[idx1][0]+d[idx1][0]] = 0; 56 return &s[st[idx1][0]]; 57 } 58 }; 59 60 61 int main(){ 62 string s = "abccbd"; 63 64 cout << (new Solution())->longestPalindrome(s) << endl; 65 66 return 0; 67 }