题解 | #最长回文子串#
最长回文子串
http://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af
中心扩散法:
class Solution { public: int getLongestPalindrome(string A, int n) { if(n < 2) return n; int left, right, maxlen = 1; for(int i = 0; i < n; i++) { //以每个字符为中心左右扩散 //长度为奇数时 left = i; right = i; while(left >= 0 && right < n) { //确保不越界 if(A[left] == A[right]) { //判断左右字符是否相等 maxlen = max(maxlen, right - left + 1); //相等时更新最大长度 left--; right++; //左右各扩散一位 } else break; //若不相等则退出循环 } //长度为偶数时 left = i; right = i + 1; while(left >= 0 && right < n) { //原理同上 if(A[left] == A[right]) { maxlen = max(maxlen, right - left + 1); left--; right++; } else break; } } return maxlen; //返回最大值 } };
动态规划:
class Solution { public: int getLongestPalindrome(string A, int n) { // write code here if(n < 2) return n; int maxlen = 1; vector<vector<int>> dp(n, vector<int>(n, 0)); for (int i = 0; i < n; ++i) { dp[i][i] = 1; //长度1一定为回文 } for(int i = 2; i <= n; i++) { //从短到长对每种长度分别判断,可以这么做是因为判断较长的需要利用较短的 for(int j = 0; j < n - i + 1; j++) { //从头开始对长度i+1的子字符串判断 if(i == 2) { dp[j][j + 1] = (A[j] == A[j + 1]); //长度2判断头尾是否相等 } else { if(A[j] == A[j + i - 1]) dp[j][j + i - 1] = dp[j + 1][j + i - 2]; //长度大于等于3,判断两头是否相等,若相等则同去两头的bool值一样 else dp[j][j + i - 1] = 0; //否则为0 } if(dp[j][j + i - 1]) maxlen = max(maxlen, i); //更新最大值 } } return maxlen; } };