leetcode5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
代码一:中心扩散法
class Solution {
public String longestPalindrome(String s) {
int start=0;
int end=0;
char[] chars=s.toCharArray();
for(int i=0;i<s.length();i++){
//奇数型回文字符串
int len1=centerexpand(chars,i,i);
//偶数型字符串
int len2=centerexpand(chars,i,i+1);
//取较长的那种情况
int len=Math.max(len1,len2);
//长度变长,就进行更新
if(len>end-start){
start=i-(len-1)/2;
end=i+len/2;
}
}
return s.substring(start,end+1);
}
public int centerexpand(char[] chars,int left,int right){
while(right<chars.length&&left>=0&&chars[left]==chars[right]){
left--;
right++;
}
return right-left-1;
}
}
代码二:
class Solution {
public String longestPalindrome(String s) {
char[] chars=s.toCharArray();
int len=s.length();
//用来标记之间是否能组成回文序列
boolean[][] flag=new boolean[len][len];
for(int i=0;i<len;i++)
flag[i][i]=true;
int begin=0;
int maxlength=1;
for(int j=1;j<len;j++){
for(int i=0;i<j;i++){
//i和j不相等,代表i j之间就不能组成回文序列
if(chars[i]!=chars[j]){
flag[i][j]=false;
}else{
//如果之间只有一个字符,那么就肯定可以
if(j-i+1<3){
flag[i][j]=true;
//如果有其他字符那么就进行状态转移
}else{
flag[i][j]=flag[i+1][j-1];
}
}
//更新
if(flag[i][j]&&j-i+1>maxlength){
maxlength=j-i+1;
begin=i;
}
}
}
return s.substring(begin,begin+maxlength);
}
}