LeetCode(题解) 最长回文字串

题目

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

方法一 暴力破解

 public static String longestPalindrome(String s) {
        if(s.length() == 2 && s.charAt(0)!=s.charAt(1)){
            return String.valueOf(s.charAt(0));
        }
        int length = s.length();
        String curS = "";
        String[] strings = new String[length];
        boolean isHui = true; //默认是回文串
        for (int i = 0; i < length; i++) {
            curS+=s.charAt(i);
            for (int j = i+1; j < length; j++) {
                curS+=s.charAt(j);

                //验证是否回文字串
                int k = 0;
                int q = curS.length()-1;
                while (k<=q){
                    if(curS.charAt(k) != curS.charAt(q)){
                        isHui = false;
                        break;
                    }
                    k++;
                    q--;
                }
                if(isHui){
                    strings[i] = curS;
                }else{
                    isHui = true;
                }
            }
            curS = "";
        }
        String maxHui = "";
        for (String string : strings) {
            if(string!=null){
                if(string.length()>maxHui.length()){
                    maxHui = string;
                }
            }
        }
        if(maxHui.equals("")){
            return String.valueOf(s.charAt(0));
        }
        return  maxHui;
    }

方法二 中心扩散法

  public static String longestPalindrome1(String s) {
        if (s == null || s.length() == 0) {
            return "";
        }
//         保存起始位置,测试了用数组似乎能比全局变量稍快一点
        int[] range = new int[2];
        char[] str = s.toCharArray();
        for (int i = 0; i < s.length(); i++) {
//             把回文看成中间的部分全是同一字符,左右部分相对称
//             找到下一个与当前字符不同的字符
            i = findLongest(str, i, range);
        }
        return s.substring(range[0], range[1] + 1);
    }

    public static int findLongest(char[] str, int low, int[] range) {
        //aaasdazvsd
//         查找中间部分
        int high = low;
        while (high < str.length - 1 && str[high + 1] == str[low]) {
            high++;
        }
//         定位中间部分的最后一个字符
        int ans = high;
//         从中间向左右扩散
        while (low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]) {
            low--;
            high++;
        }
//         记录最大长度
        if (high - low > range[1] - range[0]) {
            range[0] = low;
            range[1] = high;
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值