题解 | #最长回文串#

最长回文子串

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

动态规划解决的遍历顺序

具体的动态规划的思想已经有很多小伙伴说过了,此处不再赘述。动态规划一定要注意遍历的顺序。

我们的动态规划转移方程为:dp[i][j] = dp[i+1][j-1]
所以更新dp[i][j]之前,一定要保证dp[i+1][j-1]已经被更新过了,是最新的值而不是原始值。具体来看代码:

如果你的遍历顺序是下面这样的:

...
for(int i = 0 ; i < n ; i++ ){//左边界
    for(int j = i ; j < n ; j++ ){//控制右边界
        ...
        flag[i][j] = flag[i+1][j-1];
        ...
     }
}

那么就踩雷了。你的遍历顺序是从左到右的遍历,在你遍历flag[i][j]时,flag[i+1][j-1]还没有被更新,所以,即便flag[i+1][j-1]本应该是回文,但是因为还没有被遍历到,此时依旧为原始值false,那么flag[i][j]也为false,最后得不到正确的答案。所以我们在遍历flag[i][j]时,需要已经遍历过flag[i+1][j-1]才可以。具体的遍历顺序如下所示。

public class Solution {
    public int getLongestPalindrome(String A, int n) {
        // write code here
        if(n < 2) return n;

        boolean[][] flag = new boolean[n][n]; //动态规划
        int maxLen = 1; // 存储最长的回文长度

        for(int i = 0 ; i < n ; i++) flag[i][i] = true; //对角线赋值为真

        for(int i = n - 1 ; i >= 0 ; i-- ){//控制左边界
            for(int j = n - 1 ; j > i ; j-- ){//控制右边界

                //只有一个字母已经赋值为真,两端不同flag[i][j]不可能为回文
                if(i - j == 0 || A.charAt(i) != A.charAt(j)) continue; 

                //两端相同,且为两个字母,一定为回文
                if(j - i < 2) flag[i][j] = true;

                //两端相同,此时应该使用状态转移方程
                //在更新flag[i][j]之前应该先保证flag[i+1][j-1]已被更新过而非原始值
                else flag[i][j] = flag[i+1][j-1];

                //更新最长长度
                if(flag[i][j]) maxLen = Math.max(maxLen , j - i + 1);
            }
        }
        return maxLen;
    }
}
全部评论

相关推荐

千千倩倩:简历问题有点多,加v细聊
点赞 评论 收藏
分享
天门一键开:她的意思是问你有没有论文吧
点赞 评论 收藏
分享
||&nbsp;先说下主播个人情况:211本,暑期实习之前有过一段中大厂的后端实习,暑期拿过腾讯的实习offer,综合考虑业务和语言最终去了美团。实习期间体感还是不错的,5月初去的,去了就一直急着要需求做,担心因为没有产出导致转正失败,在第二个星期就和mt透露我希望能够留用。虽然第一个由于美团新人landing的友好性基本没做什么需求,但是后面也写出了小2w行的代码量(不包含单测)。中期经常主动加班赶需求,经常持续一两个星期加班到10点甚至更后面。mt对我确实不错,也是言传身教,实习期间给我讲了很多关于单测,ddd,set化等的理解,也是受益匪浅,此外在做需求的时候,也能看出把比较有含金量的部分交给我做...
菜菜菜小白菜菜菜:我在字节实习了四个月,有转正的压力所以周末大部分也在公司自学,也是因为一些原因转正拖的很久,这个点还没答辩,过段时间才回去答辩。整个不确定性的焦虑贯穿了我的秋招三个月,我也曾经犹豫过是不是应该放弃转正走秋招更快,最后因为沉没成本一直舍不得放弃,前前后后七个月真的挺累的,尤其是没有来字节实习的同学已经校招拿到意向时更加焦虑。这段时间也跟mentor聊了很多次,他告诉我未来工作上或者生活上,比这些更头疼的事情会更多,关键还是要调整好自己的心态。转正没有通过从过程上来看其实跟你自身没太大的关系,拖了三个月不出结果显然是ld的问题,并且今年美团最近的开奖大家似乎都不是很乐观,所以不去也罢。我在字节实习的时候,6月份有一个赶上春招末期的25届同事刚面进来,也拿到了小sp的薪水。不要对这件事有太大的压力,时代的问题罢了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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