美文网首页
Longest Palindromic Substring

Longest Palindromic Substring

作者: nafoahnaw | 来源:发表于2018-03-01 19:13 被阅读0次

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

    Example:

    Input: "babad"

    Output: "bab"

    Note: "aba" is also a valid answer.

    Example:

    Input: "cbbd"

    Output: "bb"

    大意就是找出给定字符串的最长回文

    我自己的思路如下:典型的DP问题,判断S[i,j]是否是回文,分三种情况
    1.如果i==j,那么S[i,j]是回文
    2.如果i - j < 2,表示i,j相邻,在这种情况下如果s[i] == s[j]那么S[i,j]是回文
    3.如果i,j不相邻,则必须满足s[i] == s[j] && s[i+1][j-1]为回文,则s[i,j]是回文

    public String longestPalindrome(String s) {
            if(s == null || s.length() == 0){
                return null;
            }
            /**
             * dp[i][j] == 1 表示是回文,反之则不是
             */
            int[][] dp = new int[s.length()][s.length()];
            /**
             * maxLength记录回文最大长度,给定字符串中可能有多个回文组,如果我们需要筛选最长的那一个
             * ,则需要maxLength在运行时记录当前最长的回文长度
             * left/right用来记录当前最长回文的起止index,最后我们将用他们从给定字符串中截取最后的结果
             */
            int maxLength = 0, left = 0, right = 0;
    
            for(int i = 0; i < s.length(); i++){
                for(int j = 0; j <= i; j++){
                    /**
                     * s[i] == s[j] 判断, j,i分别表示字符串的首尾index
                     */
                    if(s.charAt(i) == s.charAt(j)){
                        /**
                         * i - j < 2 满足相邻或者满足dp[i - 1][j + 1]是回文则dp[i][j]是回文
                         */
                        if(i - j < 2 || dp[i - 1][j + 1] == 1){
                            dp[i][j] = 1;
                        }
                    }else{
                        /**
                         * 上述情况都不满足,则不是回文
                         */
                        dp[i][j] = 0;
                    }
                    /**
                     * 如果dp[i][j]是回文
                     * 并且该回文的长度 >= 之前记录的最长回文长度
                     * 则重置left/right/maxLength
                     */
                    if(dp[i][j] == 1 && maxLength < i - j + 1){
                        maxLength = i - j + 1;
                        left = j;
                        right = i;
                    }
                }
            }
            /**
             * 根据left/right得到结果
             */
            return s.substring(left, right + 1);
        }
    

    双重for循环O(n2)

    相关文章

      网友评论

          本文标题:Longest Palindromic Substring

          本文链接:https://www.haomeiwen.com/subject/kjsnxftx.html