Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
tag: string
9/23/2015 update
Same algorithm as described as follows, but neater I think.
class Solution { public: string longestPalindrome(string s) { int len = s.size(); string ans; for(int i = 0; i < len; i++){ //i is the center of the possible palindromic substring int j = 0; //half length of the substring //odd palindrome while(i - j >= 0 && i + j < len && s[i - j] == s[i + j]){ j++; } int substrlen = 2 * j - 1; ans = substrlen > ans.size()? s.substr(i - j + 1, substrlen): ans; //even palindrome j = 0; while(i - j >= 0 && i + j + 1 < len && s[i - j] == s[i + j + 1]){ j++; } substrlen = 2 * j; ans = substrlen > ans.size()? s.substr(i - j + 1, substrlen): ans; } return ans; } };
直接暴力搜,AC。
分成两种情况:回文子序列为奇数长度,回文子序列为偶数长度。
第一层循环确定回文的中心位置,第二层循环挨个尝试回文的长度。
需要注意的是在循环结束时,需要把halfLength–,因为循环结束时,halfLength停留在第一个不满足条件的元素位置。
用栈应该也能解决,就像parser一个语言一样。但没有细想,觉得复杂度应该和暴力差不多。
class Solution { public: string longestPalindrome(string s) { string re; if (s.empty()){ return re; } for(int mid = 0; mid < s.size(); mid++){//odd string int halfLength; for(halfLength = 0; mid - halfLength >= 0 && mid + halfLength < s.size(); halfLength++){ if(s[mid - halfLength] == s[mid + halfLength]){ continue; } else{ break; } } halfLength--;//don't forget this line. halfLength means first not acceptable substring before this line is executed if (halfLength * 2 + 1 > re.size()){ re = s.substr(mid - halfLength, halfLength * 2 + 1); } } for (int leftMid = 0; leftMid + 1 < s.size(); leftMid++){//even string int halfLength; for(halfLength = 0; leftMid - halfLength >= 0 && leftMid + 1 + halfLength < s.size(); halfLength++){ if(s[leftMid - halfLength] == s[leftMid + 1 + halfLength]){ continue; } else{ break; } } halfLength--; if (halfLength * 2 + 2 > re.size()){ re = s.substr(leftMid - halfLength, halfLength * 2 + 2); } } return re; } };