回复大佬【LovelyBear2019】的博客《LeetCode-字符串的最长回文子串》

由于文章评论里面贴代码出现BUG,所以开了篇文章上代码

文章链接:https://blog.csdn.net/liuzhixiong_521/article/details/87158837

如题:给定一个字符串 str,找到 s 中最长的回文子串。

示例

输入1:

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

输入2:

输入: "cbbd"
输出: "bb"
public void test2(){
        String str = "babcba";
        int maxLength = 1; //最长的回文串长度
        String subString = "";
        int len = str.length();
        boolean flag = false; //当前迭代回文串存是否存在
        int num = 0;//循环次数计数器
        for(int i = 2;i <= len;i++){
            for(int j = 0;j + i <= len;j++){
                if((i - 1) != maxLength && (i - 2) != maxLength)
                    break;
                if(flag){
                    flag=false;
                    continue;
                }
                String subStr=str.substring(j,j + i);
                if(check(subStr)){
                    maxLength = i;
                    if(subString.length() < maxLength) {
                        subString = subStr;
                    }else{
                        flag=true;
                    }
                    break;
                }
            }
            if(maxLength - num == len) break;//寻找到逻辑上最长字符串后直接跳出循环
            ++num;
        }
        System.out.println("最长子串:"+subString);
    }

    /**
     * 判断是否存在回文串
     * @param subString
     * @return
     */
    private boolean check(String subString) {
        int length = subString.length();
        int mid = length / 2;
        for (int i = 0; i < mid; i++) {
            if (subString.charAt(i) != subString.charAt(length - i - 1))
                return false;
        }
        return true;
    }

尴了个尬,写了半天感觉还是没大哥写的好,以下是大哥的代码~~

public String longestPalindrome(String s) {
        char[] chars = new char[2 * s.length() + 1];
        for (int i = 0; i < s.length(); i++) {
            chars[2 * i] = '#';
            chars[2 * i + 1] = s.charAt(i);
        }
        chars[chars.length - 1] = '#';

        int max = 0;
        int idx = 0;

        for (int i = 0; i < chars.length; i++) {
            int k = 0;
            while (i - k >= 0 && i + k < chars.length && chars[i - k] == chars[i + k]) {
                k++;
            }
            if (k > max) {
                max = k;
                idx = i;
            }
        }

        String res = String.valueOf(chars).substring(idx - max + 1, idx + max);

        return res.replaceAll("#", "");
}

不过坚强的我还是找到了可以优化的地方:

[1] 数组长度放在for循环的条件中造成每次循环都需要通过对象指针去找属性值,可以提取出来

[2]代码中for i循环可以从1开始循环因为从0开始没什么意义

[3]同类型的变量可以在一行声明并赋予默认值

    public void test() {
        String s = "abacab";
        char[] chars = new char[2 * s.length() + 1];
        for (int i = 0; i < s.length(); i++) {
            chars[2 * i] = '#';
            chars[2 * i + 1] = s.charAt(i);
        }
        int length = chars.length;
        chars[length - 1] = '#';
        int max = 0,idx = 0;
        for (int i = 1; i < length; i++) {
            int k = 0;
            while (i - k >= 0 && i + k < length && chars[i - k] == chars[i + k]) {
                k++;
            }
            if (k > max) {
                max = k;
                idx = i;
            }
        }
        String res = String.valueOf(chars).substring(idx - max + 1, idx + max);
        System.out.println(res.replaceAll("#", ""));
    }
扫描二维码关注公众号,回复: 5166145 查看本文章

猜你喜欢

转载自blog.csdn.net/yongqi_wang/article/details/87174395
今日推荐