diff --git a/LeetCode-CN/5.cpp b/LeetCode-CN/5.cpp new file mode 100644 index 0000000..01645c4 --- /dev/null +++ b/LeetCode-CN/5.cpp @@ -0,0 +1,49 @@ +class Solution { +public: + // dp[i][j]: string from i to j is palindromic + // dp[i][j]=true if dp[i+1][j-1]==true && s[i]==s[j] + static bool dp[1001][1001]; + + string longestPalindrome(string s) { + int sz = s.size(); + memset(dp, false, sizeof(dp)); + + int max_len = -1; + int begin_at = -1; + + for (int i = 0; i < sz - 1; i++) + { + dp[i][i] = true; + if (s[i] == s[i + 1]) + { + dp[i][i + 1] = true; + max_len = 2; + begin_at = i; + } + } + + for (int L = 3; L <= sz; L++) + { + for (int i = 0; i <= sz - L; i++) + { + if (dp[i + 1][i + L - 2] && s[i] == s[i + L - 1]) + { + dp[i][i + L - 1] = true; + max_len = L; + begin_at = i; + } + } + } + + // debug + // cout << begin_at << " " << max_len << endl; + if (max_len == -1) + { + return s.substr(0, 1); + } + return s.substr(begin_at, max_len); + } +}; + +// decl +bool Solution::dp[1001][1001];