给定一个字符串
s
,找到s
中最长的回文子串。你可以假设s
的最大长度为 1000。示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。示例 2:
输入: "cbbd" 输出: "bb"回文就是 无论正反都是该字符串 它两边对称相等
我先放我的吧,防止你们看完不看我的了 时间比较长 竟然达到了五秒之多还好这道题没有时间要求 确实遍历实在是太长了
public String longestPalindrome(String s) {
String kk="";
if(s.trim().length()<=1){
return s;
}
for(int i=1;i<s.length()+1;i++){
for(int j=0;j+i<s.length()+1;j++ ){
String str = s.substring(j,j+i);
if(str.equals(new StringBuilder(str).reverse().toString())){
kk=str;
break;
}
}
}
return kk;
}
我的思路呢 就是从0-2开始遍历一直遍历到结束,然后利用StringBuilder的字符串取反功能取反 如果相同就将其附给要返回的字符串。因为每个长度碰到第一个就会break所以返回的均是该长度下第一个字符串 但是无奈不仅遍历次数多,每次还要切割创建StringBuilder对象 时间到达了五秒
然后通过之后当然是要看第一名代码了 真的是太厉害了
6MS完成了该题 光是看他代码就得理解一会的了
public String longestPalindrome(String s) {
if (s == null)
throw new IllegalArgumentException();
if (s.length() < 2)
return s;
char[] arr = s.toCharArray();
int[] ret = new int[2];//回文字符串的首和尾 前闭后开区间
for (int i = 0; i < arr.length; i++) {
i = loop(arr, i, ret);
}
return s.substring(ret[0], ret[1]);
}
private static int loop(char[] arr, int low, int[] ret) {
int high = low;
while (high < arr.length - 1 && arr[high + 1] == arr[low])//判断相等字符串回文最长是多少
high++;
int res = high;
while (low >= 0 && high < arr.length && arr[low] == arr[high]) {
//因为回文所以从同一位置分开是对称的 如果该位置减一位等于该位置加一位就表示是回文
//如果一直有对称相等的 就说明该字符串未达到最长 就继续-- ++
//该判断语句 如果碰到自减或自增到字符串边界则返回 或者 不等返回 此时均是在当前起始位置字符最长的回文
low--;
high++;
}
if (high - low - 1 > ret[1] - ret[0]) {
ret[1] = high;
ret[0] = low + 1;
}
return res;
}
6MS的大佬