5. 最长回文子串
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
代码:
暴力法: 超时
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
int left=0,right=0;
int count1=0 ,count2=0;
int k=0;
if(len0||len1){
return s;
}
for(int i=0;i<len-1;i++){
if(s.charAt(i)s.charAt(i+1)){
count2=2;
left=i-1;
right=i+2;
while(left>=0&&right<len){
if(s.charAt(left)s.charAt(right)){
left--;
right++;
count2+=2;
}
}
if(count1<count2){
count1=count2;
k=left+1;
}
}
else{
count2=1;
left=i-1;
right=i+1;
while(left>=0&&right<len){
if(s.charAt(left)==s.charAt(right)){
left--;
right++;
count2+=2;
}
}
if(count1<count2){
count1=count2;
k=left+1;
}
}
}
return s.substring(k,k+count1) ;
}
}
解法二: 极度低效

代码:
class Solution {
public String longestPalindrome(String s) {
int len =s.length();
if(len==1||len==0){ //空串和长度为1直接返回
return s;
}
int[][] str_len=new int[len][len];
for(int i=0;i<len;i++){ //初始化
for(int j=0;j<len;j++){
str_len[i][j]=-1;
}
str_len[i][i]=1; //字串长为1,必是回文串
}
for(int i=0;i<len;i++){ //初始化
for(int j=i+1;j<len;j++){
if(str_len[i][j]<0){
fun( s, i, j, str_len);
}
}
}
fun( s, 0, len-1, str_len);
//找出最长回文子串
int temp=1,k=0;
for(int i=0;i<len;i++){ //初始化
for(int j=i+1;j<len;j++){
if(str_len[i][j]>temp){
k=i;
temp=str_len[i][j];
}
}
}
return s.substring(k,k+temp);
}
public static void fun(String s,int i,int j,int[][] str_len) {
int k=0,maxlen=1;
if(i==j){
return ;
}
if(j==i+1){ //字串长为2单独处理
str_len[i][j]=(s.charAt(i)==s.charAt(j))?2:0;
return;}
if(str_len[i+1][j-1]==-1){
fun( s,i+1, j-1, str_len);
}
if(str_len[i+1][j-1]>0&&(s.charAt(i)==s.charAt(j))) {
str_len[i][j]=str_len[i+1][j-1]+2;
}
else{
str_len[i][j]=0;
}
}
}
浙公网安备 33010602011771号