ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

01-动态规划专项-力扣第五题

2021-07-31 16:30:26  阅读:201  来源: 互联网

标签:专项 01 示例 int chars 力扣 maxLength dp 回文


最长回文子串

问题描述:

给你一个字符串 s,找到 s 中最长的回文子串。

示例1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例2:

输入:s = "cbbd"
输出:"bb"

示例3:

输入:s = "a"
输出:"a"

示例4:

输入:s = "ac"
输出:"a"

思路:

  • 既然是动态规划专场,这里就只介绍动态规划的思路。

回文串有先天性的转移特性,如果一个字符串是回文串,那么它去掉首位的子串也是一个回文串,当然需要这个回文串长度严格大于2才成立。

这样我们就可以用来定义回文串的转移方程。如果 i 和 j 位置上的字符相同的话,那么[ i j ]是否为回文串就取决于[ i + 1 j + 1]是否是回文串。这样我们就找到了转移方程。

当然还需要一些细节需要处理,比如边界和初始值。

易知,单个字符是回文串,所以长度为1的子串一定是回文串。至于边界,我们遍历到从0到n-1的所有值即可。

当 i 和 j 对应的字符相等的时候,如果 i 和 j 之间没有字符,或者只有一个字符,那么直接判定为回文串,也就是当j-i<3的时候

Java代码

/**
    * @Description: 动态规划专项第一题 力扣第五题 中等
    * @return: 返回结果
    * @Author: Mr.Gao
    * @Date: 2021/7/31
    */
    public String longestPalindrome(String s) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        if(n<2){
            return s;
        }

        int start=0;
        int maxLength=1;

        //dp[i][j]表示chars[i]~char[j]是否为回文串
        boolean[][] dp = new boolean[n][n];
        for(int i=0;i<n;i++){
            dp[i][i] = true;
        }
        for (int j = 1; j < n; j++) {
            for (int i = 0; i < j; i++) {
                if (chars[i] != chars[j]) {
                    dp[i][j] = false;
                } else {
                    if (j - i < 3) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                }
                if (dp[i][j] && j - i + 1 > maxLength) {
                    maxLength = j - i + 1;
                    start = i;
                }
            }
        }
        return s.substring(start,start+maxLength);
    }

标签:专项,01,示例,int,chars,力扣,maxLength,dp,回文
来源: https://blog.csdn.net/qq_45778676/article/details/119277293

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有