字符串

37 阅读1分钟

中等

最长回文子串

回文串即从前往后读和从后往前读的结果是一致的,比如:abba就是回文串,而abb不是回文串。判断字符串s中是否存在回文串,一种解决思路是,以某个字符为起点,向两边展开,如果需要求最长回文子串,只需要在每次求完后,比较长度即可。 但是由于回文子串的长度可能是奇数,也可能是偶数,因此,向起点可以是一个,也可以是相邻的两个字符。

// 以l,r两个字符为中心,求回文子串
string palindrome(string s, int l, int r) {
    while(l >= 0 && r < s.size() && s[l] == s[r]) {
        l--;
        r++;
    }

    // s[l+1] - s[r - 1]中的字符串即回文子串
    return s.substr(l + 1, r - l - 1);
}

// 求s中的最长回文子串
string longestPalindrome(string s) {
    string res;
    // 对每个字符,求回文子串
    for (int i = 0; i < s.size(); i ++) {
        string s1 = palindrome(s, i, i);
        string s2 = palindrome(s, i, i + 1);

        // 判断奇偶的情况
        res = res.size() > s1.size() ? res : s1;
        res = res.size() > s2.size() ? res : s2;
    }

    return res;
}