找最长回文数
类型
1.aba
2.abba
单独的一个比如a 也算是一个回文数。
思路:
我的设想
我一开始觉得遍历一下数组,然后把每个i分别带入aba的方法和abba的方法进行判断。这就是我的思路。
实现
1.我写了dan(int j, String s)这个方法来实现aba类型的。
2.shuang(int j, String s)来判断abba类型的。
方法实现过程:
dan
一开始我判断它是不是第0号位的如果是就返回。然后用一个int left 和一个int right来指向下标。right指的是j 的下标。left指的是j-1的下标。然后判断right和left的下标指向的是不是相等的,如果是那么就把这个穿起来
方法是:==dan1 = s.charAt(left) + dan1 + s.charAt(right);==这个位置是非常重要的对于shuang()方法也是非常重要的因为呢;它们是穿的左边和右边,不要一开始就把dan1放在左边。这样会出问题。然后呢还有一个判断语句当防止产生越界异常。每次都要right++,left–然后只要不相等就跳出这个循环。
对于shuang()其实也差不多只是它的j不能等于s.length()-1因为他是往左右两边往外边扩展的。然后它left是j-1,right是j+1。
最后呢接收到一个dan和shaung的字符串然后比对他们的长度。输出最长的就完事了!。
这只是一个本方法。代码如下
package likou;
public class five {
public static void main(String[] args) {
five a = new five();
a.longestPalindrome(“babad”);
System.out.println(a.longestPalindrome(“babad”));
}
public String longestPalindrome(String s) {
if (s.length() == 1) {
return s;
}
String dan = s.charAt(0)+"";
String shuang = "";
for (int j = 0; j < s.length(); j++) {
if (dan(j, s).length()>dan.length()){
dan="";
dan=dan(j, s);
}
if (shuang(j, s).length()>shuang.length()){
shuang="";
shuang=shuang(j, s);
}
}
//目前我写的 单双 判断应该是没有错的但是 我们第一个里面的dan shuang传入方法后,但是在方法里面赋值没有改变。
if (dan.length() > shuang.length()) {
return dan;
} else {
return shuang;
}
}
public String dan(int j, String s) {
if (j == 0) {
return "";
}
int left = j - 1;
int right = j;
// 不对,不对应该要先执行一遍!
String dan1 = “”;
while (left >= 0 && right <= s.length() - 1) {
if (s.charAt(left) == s.charAt(right)) {
dan1 = s.charAt(left) + dan1 + s.charAt(right);
}
else{
break;
}
left–;
right++;
}
return dan1;
//现在对了!! 但是还是有个问题就是
// 下一次传入参数进来那么String dan还会继续串联起来。
}
public String shuang(int j, String s) {
if (j == s.length() - 1 || j == 0) {
return "";
} else {
int left = j - 1;
int right = j + 1;
String shuang1 = s.charAt(j) + "";
while (left >= 0 && right <= s.length() - 1) {
if (s.charAt(left) == s.charAt(right)) {
shuang1 = s.charAt(left) + shuang1 + s.charAt(right);
}
else{
break;
}
left--;
right++;
}
return shuang1;
}
}
}
谢谢大家!!