题解 | #明明的随机数#

最长回文子串

http://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507

  • 思路写在注释里

alt

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(getPalindromeString(new BufferedReader(new InputStreamReader(System.in)).readLine()));
    }

    /**
     * 获取最长回文子串长度
     * @param str
     * @return 最长回文子串长度
     */
    public static int getPalindromeString(String str) {
        char[] chararr = str.toCharArray();
        int len = chararr.length;
        if (chararr.length < 2) return chararr.length;
        int maxLen = 0;
        boolean[][] dp = new boolean[chararr.length][chararr.length];
        /**
         * 从后向前遍历
         */
        for (int i = chararr.length - 1; i >= 0; i--) {
            /**
             * 从当前遍历到的位置向后遍历
             */
            for (int j = i; j < chararr.length; j++) {
                /**
                 * 若两个字母相等,有可能成为回文
                 */
                if (chararr[i] == chararr[j]) {
                    /**
                     * 若两者相等且之间有一个以内的字母,则一定为回文
                     */
                    if (j - i < 3) { 
                        dp[i][j] = true;
                    }
                    /**
                     * 若二者相等,但中间差了2个以上的字母,则有可能是回文
                     * 具体看前者当前位置的后一个及后者当前位置的前一个是否为回文,即dp[i + 1][j - 1]
                     * 如:abcva i=0 j=4
                     *    a和a相等,要看bcv是否是回文,而bcv已经计算过了,位置在dp[1][3]
                     */
                    else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                    /**
                     * 若是回文,则更新最长子串
                     */
                    if (dp[i][j]) {
                        if (j - i + 1 > maxLen) {
                            maxLen = j - i + 1;
                        }
                    }
                }
            }
        }

        return maxLen;
    }
}

全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务