/**
* @Classname question5
* @Description TODO
* @Date 2020/4/1 17:23
* @Created by mmz
*/
public class question5 {
public String longestPalindrome(String s) {
if(s == "" || s.length()<=0){
return "";
}
int curlength = 0,maxlength = 0,index = 0;
for(int i = 0 ;i<s.length();++i){
curlength = getCurLength(s,i,0,s.length());
if(curlength >maxlength){
maxlength = curlength;
index = i ;
}
}
if(maxlength%2 == 0){
System.out.println(index);
System.out.println(maxlength);
if(index+maxlength/2 == s.length()-1){
return s.substring(index-maxlength/2+1);
}
return s.substring(index-maxlength/2+1,index+maxlength/2+1);
}else{
System.out.println(index);
System.out.println(maxlength);
if(index+maxlength/2 == s.length()-1){
return s.substring(index-maxlength/2);
}
return s.substring(index-maxlength/2,index+maxlength/2+1);
}
}
public int getCurLength(String string,int index,int start,int end) {
int count = 1;
int indexnow = index;
int indexpre = index - 1;
int indexnext = index + 1;
int first = 1;
int second = 1;
if (indexpre >= 0 && indexnext < string.length() && string.charAt(indexpre) == string.charAt(indexnext)) {
while (indexpre >= 0 && indexnext < string.length() && string.charAt(indexpre) == string.charAt(indexnext)) {
count = count + 2;
indexpre = indexpre - 1;
indexnext = indexnext + 1;
}
first = count;
}
count = 1;
indexnow = index;
indexpre = index - 1;
indexnext = index + 1;
if (indexnow >= 0 && indexnext < string.length() && string.charAt(indexnow) == string.charAt(indexnext)) {
while (indexnow >= 0 && indexnext < string.length() && string.charAt(indexnow) == string.charAt(indexnext)) {
count = count + 2;
indexnow = indexnow - 1;
indexnext = indexnext + 1;
}
second = count - 1;
}
return Math.max(first,second);
}
}
个人想法
别忘了边界判断,以后做每一道题上来要进行边界判断。
这个的思路也有点像动态规划,每次得到新的子串长度为curlength。最大的字串长度是maxlength,当前的最大的字串索引是index。
用for循环,遍历字符串中每一个字符串,查找回文字串,返回当前的字串长度即可。
长度判断,分为两种,第一种是aa这种,第二种是aba这种。但是会有特例,比如aaa,这种得到的长度应该是3。所以得到这两种方式得到的长度,我设置为first与second,比较他俩最大值作为返回长度。要注意的一点是,一定要在进行第二个比较逻辑之前,一定要把指针重新更新一遍。
最后根据得到的长度是奇数或者偶数进行分类,用String字符串中的substring方法,最后要根据长度,进行截取字符串。
官方题解
加上我自己改编一些。
class Solution {
static String longestPalindrome(String string){
if(string == "" || string.length() <=0){
return "";
}
int start=0,end=0;
for(int i = 0 ;i<string.length();++i){
int len1 = getLength(string,i,i);
int len2 = getLength(string,i,i+1);
int len = Math.max(len1,len2);
if(len > end-start){
start = i-(len-1)/2;
end = i+len/2;
}
}
System.out.println();
return string.substring(start,end+1);
}
static Integer getLength(String string ,int i,int j){
int Left = i,Right =j;
while(Left >=0 && Right <string.length() && string.charAt(Left) == string.charAt(Right)){
Left--;
Right++;
}
return Right - Left -1;
}
}
官方运行时间是我的一半。