zoukankan      html  css  js  c++  java
  • [LeetCode]最长回文子串 java

    题目:

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
    
    示例 1:
    
    输入: "babad"
    输出: "bab"
    注意: "aba"也是一个有效答案。
    示例 2:
    
    输入: "cbbd"
    输出: "bb"
    

      

    我知道的有两种方法,还有几种,我还没来得及学会...

    一种是暴力

    这种就是直接将所有的子串都枚举出来,然后逐个判断求出结果,不用想都知道,这种不是好的解法

    因为时间复杂度会很高,会达到O(n³)

    第二种是动态规划

    先建立一个二维数组dp,令dp[i][j]表示s[i...j] = 1是回文字符串,用其等于0则表示不是回文子串

    当然我这里这样遇到了内存问题,貌似是数组开太大了的yuanyin,所有这里最好用boolean类型的

    二维数组,那么由 上面的定义就可以知道,如果s.charAt(i)==s.charAt(j)并且dp[i+1][j-1]里面是true,则

    dp[i][j]也为true,之后就可以开始做了

    先将数组初始化,即相邻两个相同的字母组成的子串和单个的字母都是回文串

    所以dp[i][i]为true,dp[i][i+1]也为true

    之后再从最长回文子串为3开始筛选,如果长度比已知的最长回文子串长,那么就更新最长回文子串,ok思想就是这样

    这里我把数组的初始化和后面的筛选放在一起了

    public static String longestPalindrome(String s) {
            if (s.length()<=1)
                return s;
            String longest = s.charAt(0)+"";
            int length = s.length();
            boolean[][] dp = new boolean[length][length];
            for(int j = length-1;j>=0;j--){
                //j在前,i在后
                for(int i = j;i<length;i++){
                    dp[j][i] = s.charAt(i)==s.charAt(j)&&((i-j<3)||dp[j+1][i-1]);
                    if(dp[j][i]&&i-j+1>longest.length()){
                        longest = s.substring(j,i+1);
                    }
                }
            }
            return longest;
        }
    

      

  • 相关阅读:
    《互联网时代的软件革命-saas架构设计》读书笔记
    iphone11白苹果 解决办法最简单
    idea配置(重新配置)
    力扣刷题03--无重复字符的最长字串
    力扣刷题02--两数相加
    《设计原本》读书笔记(三)
    《设计原本》读书笔记(二)
    《设计原本》读书笔记(一)
    MVC架构科技小论文
    面向服务架构及其应用
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/9847044.html
Copyright © 2011-2022 走看看