NC17题解 | #最长回文子串#

最长回文子串

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

动态规划

  • dp[i][j]表示从i到j是否是回文字符串
  • 本题动态规划的难点在于数组初始化
//初始化先判断1个字符的, 2个字符的回文状态 再3 4 5...n个字符、、、
//而不是常规的,先从dp[0][0],dp[0][1],dp[0][2]...
//而是 dp[0][0] dp[1][1] dp[2][2] dp[3][3] 
//再是 dp[0][1] dp[1][2] dp[2][3] dp[3][4]
//再是 dp[0][2] dp[1][3]...
  • 与常规i,j从0到n循环不同,本题循环是i和j的差值每轮循环在增大
for(int l = 0; l < n; l++){
	for(int i = 0; i + l < n; i++){
    	j = i + l;	//j-i = l(j和i的差值是固定的,作为外层循环的变量值)
    }
}
0 1 2 3 4 5 6
1
2
3
4
5
6

alt

import java.util.*;


public class Solution {
    /*
     * @param A string字符串 
     * @return int整型
     */
    public int getLongestPalindrome (String A) {
        // write code here
        if(A == null || A.equals("")){
            return 0;
        }
        return com(A.toCharArray());
    }
    public int com(char[] chs){
        int n = chs.length;
        boolean[][] dp = new boolean[n][n];
        int max = Integer.MIN_VALUE;
        //l是子串长度
        //初始化先判断1个字符的, 2个字符的回文状态 再3 4 5...n个字符、、、
        //而不是常规的,先从dp[0][0],dp[0][1],dp[0][2]...
        //而是 dp[0][0] dp[1][1] dp[2][2] dp[3][3] 
        //再是 dp[0][1] dp[1][2] dp[2][3] dp[3][4]
        //再是 dp[0][2] dp[1][3]...
        for(int l = 1; l <= n; l++){
            //i是子串的起始位置
            for(int i = 0; i+(l-1) < n; i++){
                //j是子串的终止位置
                int j = i + l - 1;
                if(l==1){
                    dp[i][j] = true;
                }else if(l == 2){
                    dp[i][j] = (chs[i] == chs[j]?true:false);
                }else{
                    dp[i][j] = (chs[i] == chs[j]) && dp[i+1][j-1];
                }
                if(dp[i][j] && l > max){
                   max = l;
                }
            }
        }
        return max;
    }
}

全部评论

相关推荐

11-03 13:18
门头沟学院 Java
包行:平时怎么刷算法题的哇,字节的手撕听说都很难
字节跳动工作体验
点赞 评论 收藏
分享
11-04 10:30
已编辑
门头沟学院 研发工程师
开心小狗🐶:“直接说答案”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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