美文网首页
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