最长回文串

方法一:暴力求解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;
    }

还有更好的用“马拉车算法”和动态规划。这里就不细说了,网上就更多更好讲解博客。

posted @ 2018-06-30 10:50  追逐更好的自己  阅读(244)  评论(0编辑  收藏  举报