【LeetCode5】最大回文子串(中心扩散法)

简介: 中心扩散法。从每个节点开始,当前结点向两边扩散来判断回文串,因为回文串长度可能是奇数或者偶数,即后者就木有一个中心字符,伪代码应该如下:

一、题目

image.png

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母(大写和/或小写)组成

二、思路

中心扩散法。

从每个节点开始,当前结点向两边扩散来判断回文串,因为回文串长度可能是奇数或者偶数,即后者就木有一个中心字符,伪代码应该如下:

for 0 <= i < len(s):
    找到以 s[i] 为中心的回文串
    找到以 s[i] 和 s[i+1] 为中心的回文串
    更新答案

我们通过传入的左指针l和右指针r,可以同时处理回文串为奇数和偶数的情况。注意palindrome函数最后的s.substr(l+1, r-1-l)中,右边界是相对下标,其计算是:(r-1)-(l+1)+1=r-l-1

三、代码

class Solution {
public:
    string longestPalindrome(string s) {
        string ans;
        for(int i = 0; i < s.size(); i++){
            //以s[i]为中心的最长回文子串
            string s1 = palindrome(s, i, i);
            //以s[i]和s[i+1]为中心的最长回文子串
            string s2 = palindrome(s, i, i + 1);
            //ans = longest(ans, s1, s2)
            if(ans.size() < s1.size()){
                ans = s1;
            }
            if(ans.size() < s2.size()){
                ans = s2;
            }
        }
        return ans;
    }
    string palindrome(string& s, int l, int r){
        //防止索引越界
        while(l >= 0 && r < s.size() && s[l] == s[r]){
            //向两边展开
            l--;r++;
        }
        return s.substr(l + 1, r - l - 1);
    }
};
相关文章
|
6月前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
6月前
|
SQL 算法 数据挖掘
LeetCode第五题:最大回文子串【5/1000 python】
LeetCode第五题:最大回文子串【5/1000 python】
|
7月前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
61 1
|
7月前
leetcode-647:回文子串
leetcode-647:回文子串
40 0
|
7月前
|
索引
leetcode647回文子串刷题打卡
leetcode647回文子串刷题打卡
46 0
代码随想录刷题|LeetCode 647. 回文子串 516.最长回文子序列
代码随想录刷题|LeetCode 647. 回文子串 516.最长回文子序列
代码随想录刷题|LeetCode 647. 回文子串 516.最长回文子序列
|
算法
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
89 0