[LeetCode]最长回文子串

本文探讨了如何使用C++实现暴力求解法寻找字符串s中的最长回文子串,并介绍了中心扩展法以降低时间复杂度。通过实例和代码展示了这两种方法,并对比了它们在LeetCode上的性能。重点在于理解回文子串的中心扩展原理和优化算法策略。
摘要由CSDN通过智能技术生成

题目描述

给你一个字符串 s,找到 s 中最长的回文子串。
最长回文子串

示例

示例 1:

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

示例2:

输入:s = “cbbd”
输出:“bb”

C++代码 暴力求解法

class Solution {
public:
    string longestPalindrome(string s) {
        string ans,temp;
        int maxlen=0;
        for(int i=0;i<s.length();i++){
            for(int j=s.length()-i;j>0;j--){
                temp = s.substr(i,j);
                //cout<<temp<<endl;
                if(Isornot(temp)){
                    if(temp.length()>=maxlen){
                        maxlen = temp.length();
                        ans = temp;
                    }
                }
            }
        }
    return ans;    
    }
    
    int Isornot(string T){
        string S(T.rbegin(),T.rend());
        if(S == T) return 1;
        else return 0;
    }
    
};

该方法就是使用了暴力求解法,即从字符串s的第一个字符开始截取后续字符作为检验最长回文子串的子字符串,以确保字符串中所有连续子字符串可以被检测,Isornot函数即将字符串倒序后与原字符串进行比较。

这种暴力求解法在Leetcode上时间是超时的,但答案是正确的。后续还需对代码进行改进,降低时间复杂度。

  • 最长公共子串
  • 动态规划法
  • 中心扩展法

这里值得注意的一点是:
substr这个函数的参数的含义为:substr(int begin,int length),太久没使用导致忘记了,即指定开始位置,从开始位置截取长度为length的字符串。

C++代码 中心扩展法

class Solution {
public:
    string longestPalindrome(string s) {
        int maxlen = 0;
        int begin=0,end=0;
        for(int i=0;i<s.length();i++){
            int len1=expand(s,i,i);
            int len2=expand(s,i,i+1);
            maxlen = max(max(len1,len2),maxlen);
            if(maxlen>end-begin+1){
                begin = i-(maxlen-1)/2;
                end = i+maxlen/2;
            }
        }
        return s.substr(begin,maxlen);
        
    }
    int expand(string s,int left,int right){
            while(left>=0 && right<s.length() && s[left]==s[right]){
                left--;
                right++;
            }
            return right-left-1;
        }
};

回文中心的两侧互为镜像。因此,回文可以从他的中心展开,并且只有 2n-1 个这样的中心(一个元素为中心的情况有 n 个,两个元素为中心的情况有 n-1 个)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,有三种方法可以解决LeetCode上的最长回文子串问题。 方法一是使用扩展中心法优化,即从左向右遍历字符串,找到连续相同字符组成的子串作为扩展中心,然后从该中心向左右扩展,找到最长的回文子串。这个方法的时间复杂度为O(n²)。\[1\] 方法二是直接循环字符串,判断子串是否是回文子串,然后得到最长回文子串。这个方法的时间复杂度为O(n³),效率较低。\[2\] 方法三是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的。这个方法的时间复杂度也为O(n³),效率较低。\[3\] 综上所述,方法一是解决LeetCode最长回文子串问题的最优解法。 #### 引用[.reference_title] - *1* [LeetCode_5_最长回文子串](https://blog.csdn.net/qq_38975553/article/details/109222153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode-最长回文子串](https://blog.csdn.net/duffon_ze/article/details/86691293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode 第5题:最长回文子串(Python3解法)](https://blog.csdn.net/weixin_43490422/article/details/126479629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值