Leetcode 5 - 最长回文子串

题目:
给定一个字符串,找出其最长的回文子串

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

"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

posted @ 2020-03-15 11:08  黑冰5  阅读(183)  评论(0编辑  收藏  举报
runAll: function() { this.resetPreCode(); hljs.initHighlightingOnLoad(); // 重新渲染,添加语法高亮 hljs.initLineNumbersOnLoad(); // 为代码加上行号 }