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);
}
}