leetcode.第5题.最长回文字符串的两种思路

本文探讨了三种解决最长回文子串问题的方法:暴力破解、向左右两边发散法和动态规划。暴力破解由于时间复杂度过高在实际应用中不可行;向左右两边发散法通过固定枢轴向两边扩散,减少了时间开销,达到O(n^2)的时间复杂度;动态规划方法尚未提及,但通常能给出更优解。博客详细介绍了这两种方法的实现细节和时间空间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

示例 1:

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

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

提示:

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


F1:暴力破解

思路:列举出所有子串,对子串进行回文判断.

暴力法思路比较简单,两个for循环列出所有子串然后调用判断回文方法.该方法在leetcode上超出时间限制,仅仅是一种思路,时间开销太大,请慎用.代码如下:

class Solution {
    public int left=0;//初始化回文串的左边界
    public int length=0;//初始化回文串的长度
    public String longestPalindrome(String s) {
        for (int i = 0; i < s.length(); i++) {
            for (int j = i; j <s.length() ; j++) {
                int temp=j-i+1;//当前子串的长度
                if(palinHelper(i,j,s)&&temp>length){ //判断条件:是回文并且子串长度大于原来回文子串长度
                    length=temp;//更新回文子串长度
                    left=i;//更新回文子串左边界
                }
            }
        }
        return s.substring(left,left+length);
    }

    //判断是否回文
    public Boolean palinHelper(Integer a,Integer b,String s){
        while (a<=b){
            if(s.charAt(a)!=s.charAt(b)){
                return false;
            }
            a++;
            b--;
        }
        return true;
    }
}
  • 时间复杂度O(n^3)
  • 空间复杂度O(1)

F2:向左右两边发散法

思路:确定一个索引为枢轴向两边发散,寻找以该索引为枢轴形成的最大回文子串,并判断该回文子串是否值得更新.

寻找最大回文串分两种情况:1.回文串是奇数串,palinHelper(a,b,arrays)就令ab相等. 2.回文串是偶数串,palinHelper(a,b,arrays),b=a+1. 两种情况均进行考虑,取其大者.

代码如下:

class Solution {
    public int left=0;
    public int length=0;//初始化

    public String longestPalindrome(String s) {
        char[] array = s.toCharArray();//转成数组,减少时间开销
        for (int i = 0; i < s.length(); i++) {
            palinHelper(i,i,array);//回文子串为奇数串
            palinHelper(i,i+1,array);//回文子串为偶数串
        }
        return s.substring(left, left + length);//左闭右开
    }

    //枢轴发散找最大回文串
    public void palinHelper(Integer a,Integer b,char[] arrays){
        int l=0;//临时变量记录当前回文串长度
        while (a>=0&&b<arrays.length&&arrays[a]==arrays[b]){//循环条件:a、b没有越界,ab处值相等
            l=b-a+1;
            a--;
            b++;
        }
        if(l>length){//更新
            length=l;
            left=a+1;
        }
}

时间复杂度O(n^2)

空间复杂度O(n)

注意:

  • String.substring()方法是左开右闭,右边界不取.
  • String转成数组可以直接索引寻值,更快.

F3:动态规划

...还没学会...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值