最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
class Solution {
public String longestPalindrome(String s) {
int i,j;
int maxlen=1;//最大长度
int len=s.length();
boolean[][]dp=new boolean[len][len];//是否回文
int maxbegin=0;//最大子串起点
char[]array=s.toCharArray();//字符串转数组
if(len<2)
return s;
for(i=0;i<len;i++)//初始化
dp[i][i]=true;
for(int l=2;l<=len;l++)//子串长度
for( i=0;i<len-l+1;i++)//子串起点
{
j=l+i-1;//子串终点
if(array[i]!=array[j])//该子串肯定不回文
dp[i][j]=false;
else //可能回文
{
if(l>3)//取决于内部
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=true;
if(dp[i][j]==true&&l>maxlen)
{
maxlen=l;
maxbegin=i;//更新最大子串的长度和起点
}
}
}
return s.substring(maxbegin,maxbegin+maxlen);
}
}
思路:
子串长度L从2到s.length()-1一直遍历,子串起点从0开始到尾遍历,子串终点为i+L-1;
定义一个Boolean类型的数组dp[i][j]来表示首尾为i、j的子串是否回文,初始化dp[i][i]为True(子串长度可为奇数);
每一个子串如果首尾字符不同,那么该长度的子串不回文;
相同的话:如果长度为2,3,子串首尾字符相同,直接标记该子串回文;长度较大的如果内层(已知)回文,那么标记回文的同时判断并更新最大子串的起点(maxbegin)和长度(maxlen)。