LeetCode.5 最长回文子串

本文介绍了解决LeetCode最长回文子串问题的三种方法:暴力求解法、中心扩散法及动态规划法,并提供了详细的代码实现。

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

原题

https://leetcode-cn.com/problems/longest-palindromic-substring/

在这里插入图片描述

这里罗列出三种解法,分别是:①暴力求解法 ②中心扩散法 ③动态规划法
废话不多说,直接上代码,思路都在代码里。
暴力求解法

public class TestLeeCode {

    public static void main(String[] args) {
        String s = "ABBABB";
        for (int i = 0; i < str.length()-1; i++) {
            for (int j = i+1; j < str.length(); j++) {
                if ( checkHuiWen(str,i,j) ) {
                    System.out.println( str.substring(i,j+1) );
                }
            }
        }
	}
	
	public static boolean checkHuiWen(String str,int begin,int end){
        int endIndex = end;

        for (int i = begin; i <= (begin+end-1)/2; i++) {
            if ( !(str.charAt(i) == str.charAt(endIndex)) ) {
                return false;
            }
            endIndex = endIndex - 1;
        }
        return true;
    }
}

中心扩散法

public class TestLeeCode {

    public static void main(String[] args) {
        String s = "ABBABB";
        if (s.length() <= 1) {
            System.out.println(s);
        }
        int begin = 0;
        int maxLen = -1;
        for (int i = 0; i < s.length()-1; i++) {
//            奇数,判断子串为奇数,中心是某一个字符
            int oddLen = checkHuiWen1(s, i, i);
//            偶数,判断子串为偶数,中心是某两个字符中
            int evenLen = checkHuiWen(s,i,i+1);
            int curMaxLen = Math.max(oddLen,evenLen);
            if (maxLen < curMaxLen) {
                maxLen = curMaxLen;
                begin = i - (maxLen-1)/2;
            }
        }
        System.out.println(s.substring(begin,begin+maxLen));
	}
	
	public static int checkHuiWen(String str,int leftIndex,int rightIndex){
//        如果 left = right 回文中心是一个字符,回文串的长度是奇数
//        如果 fight = left + 1 回文中心是两个字符,回文串的长度是偶数

        int left = leftIndex;
        int right = rightIndex;

        int len = 0;
        while (left>=0 && right<str.length()){
            if (str.charAt(left) == str.charAt(right)){
                left--;
                right++;
                len+=2;
            } else {
                break;
            }
        }
       if (len != 0 && leftIndex == rightIndex) {
            len--;
       }
        return len;
    }
}

动态规划法

public class TestLeeCode {

    public static void main(String[] args) {
        String s = "ABBABB";
        String str = checkHuiWen(s);
        System.out.println(str);
	}
	
    /**
     * 将i,j范围内的子串回文转化为 i+1,j-1位置内的子串回文(i,j表示字符串下标)
     * @param str
     * @return
     */
    public static String checkHuiWen(String str){
        int len = str.length();
        if (len < 2) {
            return str;
        }

        int maxLen = 1;
        int begin = 0;

//        dp[i][j] 表示 str[i..j] 是否是回文数字
        boolean[][] dp = new boolean[len][len];
        for (int i = 0; i < len; i++) {
            dp[i][i] = true;
        }

//        填写二维数组的左下角(i < j)
        for (int j = 1; j < len; j++) {
            for (int i = 0; i < j; i++) {
                if (str.charAt(i) != str.charAt(j)) {
                    dp[i][j] = false;
                } else {
//                    当前字符串个数为小于3的时候,直接赋值为true
                    if (j - i < 3) {
                        dp[i][j] = true;
                    } else {
//                        动态转化
                        dp[i][j] = dp[i+1][j-1];
                    }
                }

                if (dp[i][j] == true && (j-i+1)>maxLen) {
                    maxLen = j-i+1;
                    begin = i;
                }

            }
        }
        return str.substring(begin,begin+maxLen);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

难过的风景

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

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

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

打赏作者

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

抵扣说明:

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

余额充值