题目
2.思路
这道题做了很长时间,可能还是自己彩笔吧,昨天因为这道题都没有完成一天一道题的任务。
你要找最长的回文字符串,我没有想的什么好的方法,就是一个一个字符的比较吧。
像“abcba”这种字符串,遍历它从i=0到s.length()-1。对于每个字符,他周围的字符窜还要作比较,先想一下周围的多少个字符做比,当i < (s.length() - 1)/2时这个字符左边的i个数和右边的i个数作比较;否则左右两边s.length() - i - 1个字符做比。那么“abcba”就相当于a要比0次;b要比一次,b左边右边c很明显不用存字符串;c要比两次,很明显abcba是一个回文字符串;后面的b比一次很明显不行。
上面的有一种情况,像“abccba”这样的字符串刚才那样比的话就没有最长的回文字符串。问题的原因在于当遍历到第一个c是c和后面的c相同了,遇到这种情况右边的应该扩一位作比较。也就是当遍历到第一个c时,发现第i个字符和第i+1个字符相等那么后面的就要扩一位。
3.注意
我一共试了四次,因为有一些特殊样例。
第一,给的是空的字符串或者只给了一个字符。给一个字符时要初始化为第一个字符。
第二,“aaa”这种情况的处理,当你遍历到第二个a时,因为第二个数字和第三个数字相等,再按之前的比的话就会应越界编译错误。
4.贴图打卡
贴代码
class Solution {
public String longestPalindrome(String s) {
String string="";
String string1="";
if (s.length()!=0) {
string1=s.charAt(0)+"";
}
StringBuilder sb=new StringBuilder(s+"");
for (int i = 0; i < s.length() - 1; i++) {
int divide = 0;
if (i <=(s.length() - 1) / 2) {
divide = i;
} else {
divide = s.length() - i - 1;//bbbb
}
if (s.charAt(i) == s.charAt(i + 1)) {
string = sb.substring(i, i + 2);
if (string.length() > string1.length()) {
string1 = string;
}
for (int i1 = 0; i1 < divide; i1++) {
if(i1+1+i+1<s.length()) {
if (s.charAt(i - i1 - 1) != s.charAt(i + i1 + 2)) {
string = sb.substring(i - i1, i + i1 + 2);
if (string.length() > string1.length()) {
string1 = string;
}
break;
} else {
string = sb.substring(i - i1 - 1, i + i1 + 3);
if (string.length() > string1.length()) {
string1 = string;
}
}
}
}
}
for (int i1 = 0; i1 < divide; i1++) {
if (s.charAt(i - 1 - i1) != s.charAt(i + 1 + i1)) {
string = sb.substring(i - i1, i + i1 + 1);
if (string.length() > string1.length()) {
string1 = string;
}
break;
} else {
string = sb.substring(i - i1 - 1, i + i1 + 2);
if (string.length() > string1.length()) {
string1 = string;
}
}
}
}
return string1;
}
}