最长回文子串

最长回文子串

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;
    }
}
全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
7 5 评论
分享
牛客网
牛客企业服务