最长回文子串

最长回文子串

http://www.nowcoder.com/questionTerminal/b4525d1d84934cf280439aeecc36f4af

dp[i][j]表示以A[i]为开头A[j]结尾的回文子串长度,如果不是回文,值为0

  • i == j显然有dp[i][j] = 1
  • 其他情况有如下事实:长度大于2的回文串,去掉首尾后还是回文串
    所以判断一个串是否是回文,除了要看首尾是否相同,还要看去掉首尾后的子串是否回文,这就是状态从子串转移到母串的规律

这样一来就可以从长度为2的子串入手,一步步提升子串判断长度,将状态转移到整个串。

import java.util.*;

public class Solution {
    public int getLongestPalindrome(String A, int n) {
        int[][] dp = new int[n][n];
        int max = 0;
        for (int i = 0; i < n; ++i) {
            dp[i][i] = 1;
        }
        char[] a = A.toCharArray();
        // 从长度为2的子串入手,一步步提升子串判断长度
        for (int len = 2; len <= n; ++len) {
            // 遍历开头
            for (int i = 0; i <= n - len; ++i) {
                // 子串的结尾
                int j = i + len - 1;
                // 长度大于2的回文串,去掉首尾后还是回文串
                if(a[i] == a[j] && (len == 2 || dp[i + 1][j - 1] != 0)) {
                    dp[i][j] = len;
                    // 因为判断的子串长度递增,答案的值肯定也是非降序更新的,所以不需要比较大小
                    max = len;
                }
            }
        }
        return max;
    }
}
全部评论

相关推荐

想按时下班的我在等o...:我投测试也是这个情况,不知道咋办了
点赞 评论 收藏
分享
牛客38347925...:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
实习吐槽大会
点赞 评论 收藏
分享
评论
7
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务