要求:
给你一个字符串 s
,找到 s
中最长的回文子串。个字符串
s
,找到 s
中最长的回文子串
最终没有通过 :
String s="aacabdkacaa";
这个测试卡bug!
package com.zhm.test;
/**
* @Author bige
* @Date: 2022/11/18 20:03
* @ApiNote:给你一个字符串 s,找到 s 中最长的回文子串。回文子串的意思是:正读一样,反读也一样。
*/
public class Leatcode_test005 {
public static String longestPalindrome(String s) {
String sub="";
int flag=-1;
if(s.trim()!=""){
for (int i = 0; i < s.length(); i++) {
System.out.println("===================================i="+i);
if(s.indexOf(s.charAt(i)) != s.lastIndexOf(s.charAt(i))){
int first = s.indexOf(s.charAt(i));
int last = s.lastIndexOf(s.charAt(i));
//System.out.println("first_num="+(first));
//System.out.println("last_num="+(last));
if((last-first)>2){//(6-0)/2=3
for (int j = 0; j < ((last-first)/2); j++) {
System.out.println("first="+(first+j+1));
System.out.println("last="+(last-j-1));
System.out.println("first_num="+s.charAt(first+j+1));
System.out.println("last_num="+s.charAt(last-j-1));
if(s.charAt(first+j+1) == s.charAt(last-j-1)){
System.out.println("这是回文!");
flag=1;
}else{
System.out.println("这是错误!");
flag=0;
break;
}
}
if(!(flag==0)){
sub=s.substring(first,last+1);
return sub;
}
}else {
//System.out.println("这是回文!i="+i);
sub=s.substring(first,last+1);
return sub;
}
}else {
if(s.length()==1){
return s;
}else if(s.length()==2){
return s.substring(0,1);
}
}
}
}
return sub;
}
public static void main(String[] args) {
//String s ="asftyubcacbad";
//String s ="axsdccccc";
//String s ="cbbd";
//String s="ac";
String s="aacabdkacaa";
//longestPalindrome(s);
System.out.println("result="+longestPalindrome(s));
}
}
我的这种办法确实有很多缺陷,测试数据无法通过。打算换另一算法。
第二种办法:
我们先捋清楚思路:
1.我们遍历一遍所有的字符串。每一个字母都拿来进行比对。
2.在遍历每一个字母的时候,向左右两边去进行比对。
如下图所示:当索引为3时,字母为a. 然后向左边查询=b , 向右边查询=b . 且没有超出边界则视为回文。
贴上代码:
package com.zhm.test;
/**
* @Author bige
* @Date: 2022/11/18 20:03
* @ApiNote:给你一个字符串 s,找到 s 中最长的回文子串。回文子串的意思是:正读一样,反读也一样。
*/
public class Leatcode_test005 {
public static String longestPalindrome1(String s) {
String sub="";
int flag=-1;
if(s.trim()!=""){
for (int i = 0; i < s.length(); i++) {
System.out.println("===================================i="+i);
if(s.indexOf(s.charAt(i)) != s.lastIndexOf(s.charAt(i))){
int first = s.indexOf(s.charAt(i));
int last = s.lastIndexOf(s.charAt(i));
//System.out.println("first_num="+(first));
//System.out.println("last_num="+(last));
if((last-first)>2){//(6-0)/2=3
for (int j = 0; j < ((last-first)/2); j++) {
System.out.println("first="+(first+j+1));
System.out.println("last="+(last-j-1));
System.out.println("first_num="+s.charAt(first+j+1));
System.out.println("last_num="+s.charAt(last-j-1));
if(s.charAt(first+j+1) == s.charAt(last-j-1)){
System.out.println("这是回文!");
flag=1;
}else{
System.out.println("这是错误!");
flag=0;
break;
}
}
if(!(flag==0)){
sub=s.substring(first,last+1);
return sub;
}
}else {
//System.out.println("这是回文!i="+i);
sub=s.substring(first,last+1);
return sub;
}
}else {
if(s.length()==1){
return s;
}else if(s.length()==2){
return s.substring(0,1);
}
}
}
}
return sub;
}
public static String longestPalindrome(String s) {
String res = new String();//指向结果
for(int i = 0; i < s.length(); i++){//遍历字符串,依次以当前字符为中心字符
for(int j = 0; j <= 1; j++){//j = 0, 单个中心,j = 1两个中心
int l = i, r = i + j;//左右指针
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)){
if(res.length() < r - l + 1){//更新当前子串
res = s.substring(l, r + 1);//截取子串,左闭右开
}
l--;
r++;
}
}
}
return res;
}
public static void main(String[] args) {
//String s ="asftyubcacbad";
//String s ="axsdccccc";
//String s ="cbbd";
//String s="ac";
String s="aacabdkacaa";
//longestPalindrome(s);
System.out.println("result="+longestPalindrome(s));
}
}
代码效果: