5--最长回文子串(动态规划)

题目

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

示例 1:

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

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

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

解释

  • 首先定义一个二维数组a[][],这个数组是用来表示i到j是不是回文串的标识,是boolean类型的,由于1到1和2到2这种的都是回文串,所以在创建的时候就初始化为a[i][i]=true
  • 设置一个长度L,从2开始,这个长度就是每次比量的时候的长度,就是把一个字符串拆出一个个小串,对这些小串进行比量。比如当L=2的时候,i=0,j=1;i=1j=2;i=2,j=3;因为只有这样才能让前指针和后指针不相等的时候进行处理,直接等于它俩包围的那个就行。
  • 只有当a[i][j]等于true的时候和j-i大于最大值的时候,因为要找最大的,才更新left和max。

代码

点击查看代码
class Solution {
    public String longestPalindrome(String s) {
         if(s.length()<2){
            return s;
        }
        int length=s.length();
        int maxlength=0;
        int left=0;
        boolean arr[][]=new boolean[length][length];
        for(int i=0;i<length;i++){
                arr[i][i]=true;
        }
        char[] c = s.toCharArray();
        for(int L=2;L<=length;L++){
            for(int i=0;i<length;i++){
                int j=L+i-1;
                if(j>=length){
                    break;
                }
                if(c[i]!=c[j]){
                    arr[i][j]=false;
                }
                else {
                    if(j-i<3){
                        arr[i][j]=true;
                    }
                    else {
                        arr[i][j]=arr[i+1][j-1];
                    }
                }
                if(arr[i][j]&&(j-i)>maxlength){
                    maxlength=j-i;
                    left=i;
                }
            }
        }
        return s.substring(left,left+maxlength+1);
    }
}
posted @   是徐洋洋呀  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2021-04-24 Leetcode/数学/计数质数
点击右上角即可分享
微信分享提示