12
12
13
13
#include < iostream>
14
14
#include < string>
15
+ #include < vector>
15
16
using namespace std ;
16
17
17
18
string findPalindrome (string s, int left, int right)
@@ -27,7 +28,7 @@ string findPalindrome(string s, int left, int right)
27
28
}
28
29
29
30
30
- string longestPalindrome (string s) {
31
+ string longestPalindrome_recursive_way (string s) {
31
32
int n = s.size ();
32
33
if (n<=1 ) return s;
33
34
@@ -48,6 +49,40 @@ string longestPalindrome(string s) {
48
49
return longest;
49
50
}
50
51
52
+ // Memory Limit Exceeded
53
+ string longestPalindrome_dp_way (string s) {
54
+
55
+ string longest;
56
+
57
+ int n = s.size ();
58
+ if (n<=1 ) return s;
59
+
60
+ // Construct a matrix, and consdier matrix[i][j] as s[i] -> s[j] is Palindrome or not.
61
+ vector< vector<int > > matrix (n, vector<int >(n));
62
+
63
+ // Dynamic Programming
64
+ // 1) if i == j, then matrix[i][j] = true;
65
+ // 2) if i != j, then matrix[i][j] = (s[i]==s[j] && matrix[i+1][j-1])
66
+ for (int i=n-1 ; i>=0 ; i--){
67
+ for (int j=i; j<n; j++){
68
+ // The following if statement can be broken to
69
+ // 1) i==j, matrix[i][j] = true
70
+ // 2) the length from i to j is 2 or 3, then, check s[i] == s[j]
71
+ // 3) the length from i to j > 3, then, check s[i]==s[j] && matrix[i+1][j-1]
72
+ if ( i==j || (s[i]==s[j] && (j-i<2 || matrix[i+1 ][j-1 ]) ) ) {
73
+ matrix[i][j] = true ;
74
+ if (longest.size () < j-i+1 ){
75
+ longest = s.substr (i, j-i+1 );
76
+ }
77
+ }
78
+ }
79
+ }
80
+
81
+ return longest;
82
+ }
83
+ string longestPalindrome (string s) {
84
+ return longestPalindrome_dp_way (s);
85
+ }
51
86
52
87
int main (int argc, char **argv)
53
88
{
0 commit comments