版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37590135/article/details/80140197
记录一下~~
作者刷leetcode刷到吐血,第五题感觉没有太好的官方解决方法,我是这么做的
问题:
思路:由于字符串可能很大,消耗计算量的做法肯定是不能用的,最后只遍历一次,找出所有回文
1、遍历每个字符
2、每次得到字符后,再循环,比如得到某字符a[i],则看看a[i+1]和a[i-1]是否相等,a[i]和a[i+1]是否相等,等等多种情况,这只是举个例子,若那个“1”值可以自增的话,那算法也就出来了。代码如下:
作者逻辑思维没那么强大,所以好多异常情况,写了一堆if,上代码:
class Solution {
public String longestPalindrome(String s) {
int start = 0; //起始指针
int end = 0; //结束指针
char[] c = s.toCharArray();
wai:
for(int i = 0;i < c.length;i++){
int j = 0;
int model = -1;//-1为初始,0时就是没有,1为单右,2为单左,3为两边,4为自己,5为对称,且全一样
int nowlength = end - start + 1;
for(;j + i < c.length + 1 && i-j > -2 ;j++){
if((end-start)/2 == 0 && end == 0){
model = 4;
end = 1;
continue ;
}
if((model == 3 || model == -1 || model == 4 || model == 5)&&j + i < c.length && i-j > -1 &&c[i+j] == c[i-j]){
if(model == 5 || (model == 4 && c[i+j] == c[i])){
model = 5;
}else{
model = j==0?4:3;
}
}else if(model != 2 && model != 3&&j + i < c.length &&c[i+j] == c[i-j+1] && c[i+j-1] == c[i -j+2]){
model = 1;
}else if(model != 1 && model != 3 && i-j > -1 && c[i+j-1] == c[i-j] && c[i+j-2] == c[i -j+1]){
model = 2;
}else if(model == 0 || j + i >= c.length || i-j <= -1 || (model == 3 && j != 0)){
break;
}else {
if(model == 1 || model == 2 || model == 5) break ;
model = 0;
}
}
switch (model){
case 0:continue wai;
case 1:
if(j*2-1 < nowlength) break ;
end = i+j;
start = i-j+2;
break ;
case 2:
if(j*2-1 < nowlength) break ;
end = i+j-1;
start = i-j+1;
break ;
case 3:
if(j*2-1 < nowlength) break ;
end = i+j;
start = i-j+1;
break ;
case 5:
if(j*2-1 < nowlength) break ;
end = i+j;
start = i-j+1;
break ;
}
}
return s.substring(start,end);
}
}
博文不仅仅是防止知识点忘记,也是回馈众多作者们的教导,以此回馈社会