力扣第五题:回文最长子串 --笔记

分析题:

1.首先回文,就是前面读 和 后面读一样 由此可见开头和结尾是一致的
比如:abcba 前面abc 后面abc
2. 分析这道题的时候有以下情况,既然是前后读一样,它需要一个界点分前后,我就把字符串定为:

 1.偶数
 2.奇数
 3.不是回文的情况
 4.全是一个字母的情况
 5.空串

开始写代码 ,经过了很多次代码的修改

结果:超时了
然后发现如下代码有如下的优化点:

  1. 代码寻找前后字母相同 组装成了一个空间复杂度的HashSet 然后在分析这个作用域中的值 是不是符合前,后读相同

  2. 判断是否是回文的时候:

    for (int i = count - 1; i >= midst; i–) {
    stbAft.append(val.charAt(i));
    }
    append 会每一次都copy 一次数组
    在这里插入图片描述


public class  Solution {

    public static String longestPalindrome(String val){
        //判断是否为空
        if (val == null || val.isEmpty() || val.length() == 1) {
            return val;
        }


        //存储所有开始和结尾相同 的String
        HashSet<String> tempHashResult = new HashSet<>();

        //查询所有回文
        char[] charts = val.toCharArray();

        //如果就一个字母直接return val
        if (val.matches("["+charts[0]+"]{"+charts.length+"}")) {
            return val;
        }


        for (int i = 0; i < charts.length; i++) {

            char aVal = charts[i];
            for (int j = i + 1; j < charts.length; j++) {
                char bVal = charts[j];
                if (aVal == bVal) {
                    tempHashResult.add(val.substring(i, j + 1));
                }
            }

        }


        int count = 0;
        String result = "";
        for (String cVal : tempHashResult) {
            if ((cVal.length() - 2 == 1 || cVal.length() - 2 == 0 || confirmListLongestPalindrome(cVal)) && count < cVal.length()) {
                count = cVal.length();
                result = cVal;
            }
        }

        result = result.length() == 0 ? val.substring(0, 1) : result;
        //排序回文字段
        return result;

    }
    /**
     * 判断是否是回文
     *
     * @param val 值
     * @return
     */
    private static boolean confirmListLongestPalindrome(String val) {
        int count = val.length();
        boolean isEvent = count % 2 == 0;
        StringBuilder stbAft = new StringBuilder();
        int midst = (int) Math.ceil(count / 2.0);

        for (int i = count - 1; i >= midst; i--) {
            stbAft.append(val.charAt(i));
        }
        return val.substring(0,isEvent ? midst : midst - 1).equals(stbAft.toString());
    }

    public static void main(String[] args) {
        String val = "abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa";
        long ms = System.currentTimeMillis();

        String bbb = longestPalindrome(val);
        System.out.println("bbb = " + bbb);
        long msA = System.currentTimeMillis();
        System.out.println("Simple = " + (msA - ms));
    }

}

最后优化上面的两个点

import java.util.HashSet;

public class Main {


    public static String longestPalindrome(String val) {
        //判断是否为空
        if (val == null || val.isEmpty() || val.length() == 1) {
            return val;
        }

        //查询所有回文
        char[] charts = val.toCharArray();

        //如果就一个字母直接return val
        if (val.matches("["+charts[0]+"]{"+charts.length+"}")) {
            return val;
        }
        int count = 0;
        String result = "";
        for (int i = 0; i < charts.length; i++) {

            char aVal = charts[i];
            for (int j = i + 1; j < charts.length; j++) {
                char bVal = charts[j];
                if (aVal == bVal){
                    String cval = val.substring(i, j + 1);
                    if(confirmListLongestPalindrome(cval) && count < cval.length()) {
                        count = cval.length();
                        result = cval;
                     }
                }
            }

        }
        result = result.length() == 0 ? val.substring(0, 1) : result;

        //排序回文字段
        return result;

    }

    /**
     * 递归求值
     *
     * @param val 值
     * @return
     */
    private static boolean confirmListLongestPalindrome(String val) {
        int count = val.length();
        boolean isEvent = count % 2 == 0;
        int midst = (int) Math.ceil(count / 2.0);
        StringBuilder stbAft = new StringBuilder(val.substring(midst));
        return val.substring(0, isEvent ? midst : midst - 1).equals(stbAft.reverse().toString());
    }


    /**
     * aaaa
     * adc
     *
     * @param args
     */

    public static void main(String[] args) {
        String val = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        long ms = System.currentTimeMillis();

        String bbb = longestPalindrome(val);
        System.out.println("bbb = " + bbb);
        long msA = System.currentTimeMillis();
        System.out.println("Simple = " + (msA - ms));

    }


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值