(力扣)中心扩散法求最长回文子串

Question:

给定一个字符串,输出其中最长的回文子串。
在这里插入图片描述

几种解法:

暴力枚举:时间复杂度:O(n3)(略)
(双层枚举:O(n2)判断是否为回文串:O(n))
在这里插入图片描述

动态规划:时间复杂度O(n2),空间复杂度O(n2 )运用普遍的解法,此处耗时较久、空间较大。(略)
在这里插入图片描述

中心扩散(推荐):

时间复杂度O(n2),空间复杂度O(1)
在这里插入图片描述C++代码:

class Solution {
public:
    string longestPalindrome(string s) {
        if (s.size() < 2)return s;
        int begin = 0, maxsize = 0;
        int n;
        for (int i = 0; i < s.size() - 1; i++) {//枚举中心位置
            int oddlen = expandCenter(s, i, i);//以i为中心向两边扩散
            int evenlen = expandCenter(s, i, i + 1);//以i和i+1为中心向两边扩散
            n = max(oddlen, evenlen);//取大的串长
            if (n > maxsize) {
                maxsize = n;
                begin = i - (maxsize - 1) / 2;//画图易得串起始位置(关键)
            }
        }
        return s.substr(begin, maxsize);
    }
    int expandCenter(string& s, int right, int left) {//中心扩散函数
        int i = right;
        int j = left;
        for (; i >= 0 && j <= s.size() - 1;i--,j++) {
            if (s[i] == s[j]) continue;
            else break;
        }
        return j-i+1-2;  //返回当前回文串长(画图易得j-i+1为串长,)
                         //(-2是最后跳出循环坐标移动的值)
    }
};

中心扩散:
用下标 【i】【j】 记录某个中心位置,将下标向两边以相同速率扩散(i - -,j ++),当【i】!=【j】时停止扩散。
在这里插入图片描述
在这里插入图片描述

在本题的使用思路:

枚举每个可能的中心位置(包含子串以一个元素或两个元素为中心位置的情况),每次枚举调用 中心扩散函数 ,得到当前中心位置的回文子串长度,与已得到的最大回文子串长度相比较、取最大值,并记录此串的起始位置 begin,枚举结束即可得到答案。

中心扩散函数(expandCenter):

int expandCenter(string& s, int right, int left) {//中心扩散函数
        int i = right;
        int j = left;
        for (; i >= 0 && j <= s.size() - 1;i--,j++) {
            if (s[i] == s[j]) continue;
            else break;
        }
        return j-i+1-2;  //返回当前回文串长(画图易得j-i+1为串长,)
                         //(-2是最后跳出循环坐标移动的值)
    }
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莉妮可丝的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值