题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码及分析
我的做法时动态规划,在力扣官网还有更好的方法,大家感兴趣的可以点击这里跳转至力扣官网进行参考,下面展示我的代码及思路:
class Solution {
public String longestPalindrome(String s) {
int length=s.length();
if(length<2){ //考虑特殊条件,即s为空或者s长度为1
return s;
}
boolean[][] boo=new boolean[length][length];//boo[i][j]表示已下标i开头j结尾的串是否是回文串
char[] ch=s.toCharArray();
int maxlength=1;
int start=0; //回文串开始下标
for(int i=0;i<length;i++){
boo[i][i]=true;//串长度为1时,一定是回文串
}
for(int len=2;len<=length;len++){ //len变量用于代表最长回文子串的长度
for(int i=0;i<length;i++){
int j=len+i-1; //len=j-i+1;
if(j>=length){ //循环跳出条件
break;
}
if(ch[i]!=ch[j]){
boo[i][j]=false;
}else{
if(j-i<3){
boo[i][j]=true;
}else{
boo[i][j]=boo[i+1][j-1];
}
}
if(boo[i][j]&&(j-i+1)>maxlength){
maxlength=j-i+1;
start=i;
}
}
}
return s.substring(start,start+maxlength);
}
}