美文网首页算法精习
Leetcode 5 - 最长回文子串

Leetcode 5 - 最长回文子串

作者: 小黑天天快乐 | 来源:发表于2020-03-15 11:04 被阅读0次
    题目:
    给定一个字符串,找出其最长的回文子串
    

    所谓回文,即正反两个方向读结果是一致的。举两个例子

    "aba"
    "abba"
    

    这两个例子代表着回文的奇偶两种形式,对后文的算法也有影响。

    在诸多求解这个问题的算法中,个人认为最容易理解,同时性能也较好的是中心扩展法,即:

    依次以字符串每一个位置为中心,向两侧扩展,直到两侧字符不同。

    要注意两点:

    1. 需要考虑奇偶两种情况。
    2. 对空串单独考虑

    以下为C++代码实现

    class Solution {
    public:
        int searchAround(string& s, int i, int j){
            int cnt = 0;
            while(i > 0 && j < s.size()-1){
                if(s[--i] == s[++j]){
                    cnt++;
                } else {
                    return cnt;
                }
            }
            return cnt;
        }
    
        // 中心扩展法
        string longestPalindrome1(string s) {
            if (s == "") return "";
            int sstart = 0;
            int slen = 1;
            for(int i=0; i < s.size(); ++i){
                int half = searchAround(s, i, i);
                int l1 = 2 * half + 1;
                if (l1 > slen){
                    sstart = i - half;
                    slen = l1;
                }
            }
    
            for(int i=0; i < s.size()-1; ++i){
                if(s[i] == s[i+1]){
                    int half = searchAround(s, i, i+1);
                    int l1 = 2 * half + 2;
                    if (l1 > slen){
                        sstart = i - half;
                        slen = l1;
                    }
                }
                
            }
            return s.substr(sstart, slen);
        }
    };
    

    在代码中做了两轮循环,分别考虑奇偶两种情况。searchAround函数会返回单侧的最大长度half,因此,对奇数情况的子串长度为2 * half + 1,对偶数情况的子串长度为2 * half + 2,子串起点均为i-half

    相关文章

      网友评论

        本文标题:Leetcode 5 - 最长回文子串

        本文链接:https://www.haomeiwen.com/subject/fksqehtx.html