力扣LeetCode算法题第5题-最长回文子串

要求:

给你一个字符串 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));
    }
}

代码效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逼哥很疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值