【基础算法】最长回文子串问题

105 阅读2分钟

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟 👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

@TOC


前言

今天我们继续学习算法,加油。这篇文章写的是最长回文子串问题。希望这篇可以有幸帮助到你,码字不易,请多多支持。 在这里插入图片描述


题目描述

给定一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例

示例 1:

输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd" 输出:"bb"

提示

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

解法

本题可以使用中心扩展法来解决。具体做法是,枚举字符串中的每一个字符,以该字符为中心,分别向左右两边扩展,找到以该字符为中心的最长回文子串。因为回文子串的长度可能为奇数或偶数,所以需要分别以该字符和该字符和它右侧的字符为中心,进行两次扩展操作,找到两个最长的回文子串,最终取长度更长的那一个作为最终结果。

时间复杂度:O(n2)O(n^2),其中 nn 为字符串的长度。因为需要枚举字符串中的每个字符,而每个字符又需要向左右两个方向扩展,所以总时间复杂度为 O(n2)O(n^2)

空间复杂度:O(1)O(1),只需要常数级别的空间保存最长回文子串的起始位置和长度。

代码实现

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if (n < 2) {
            return s;
        }
        int start = 0, len = 0; // 记录最长回文子串的起始位置和长度
        for (int i = 0; i < n; i++) {
            // 以s[i]为中心的奇数长度回文串
            int l = i, r = i;
            while (l >= 0 && r < n && s[l] == s[r]) {
                l--;
                r++;
            }
            if (r - l - 1 > len) {
                start = l + 1;
                len = r - l - 1;
            }
            // 以s[i]和s[i+1]为中心的偶数长度回文串
            l = i, r = i + 1;
            while (l >= 0 && r < n && s[l] == s[r]) {
                l--;
                r++;
            }
            if (r - l - 1 > len) {
                start = l + 1;
                len = r - l - 1;
            }
        }
        return s.substr(start, len);
    }
};

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.把时间尺度拉长,拉长十年看当下

2.不说负面情绪,只描述事实;

3.越专注于过好自己,能量和幸运越会照顾你; 只解决问题,不做没有意义的担心,输了就认;

4.学会原谅自己,要允许自己做错事,允许自己出现情绪波动,我知道你已经很努力很努力在做好了

5.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!