最长回文串
方法一:暴力求解O(n3)
遍历所有字串并且判断判断时候是回文找到最长回文串。
方法二:以字符串每个字符为中心向左右寻找回文串,记录最大回文串位置和长度。O(n2)。注意:例如“ACCAP”把CC看成一个字符,做特殊处理。
string longestPalindrome(string s) { if (s.size() == 0)return ""; int longest_len = 1; string res = s.substr(0, 1); for (int i = 0; i<s.size(); i++){ int left = i - 1; int right = i + 1; int tmp_len = cal_length(s, i, left, right); //cout << left << " " << right <<" "<<tmp_len<<endl; if (tmp_len>=longest_len){ longest_len = tmp_len; res = s.substr(left + 1, longest_len); } } return res; } int cal_length(string s,int mid,int &left,int& right){ while(s[mid]==s[right])right++;//特殊处理 while(left>=0&&right<s.size()&&s[left]==s[right]){ left--; right++; } return right-left-1; }
还有更好的用“马拉车算法”和动态规划。这里就不细说了,网上就更多更好讲解博客。