LeetCode05

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_32502811/article/details/81563189 最近在刷题,对于动态规划类的问题完全懵逼····就从LeetCode上找DP的题目专门练习一下,熟悉熟悉思路。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_32502811/article/details/81563189

最近在刷题,对于动态规划类的问题完全懵逼····就从LeetCode上找DP的题目专门练习一下,熟悉熟悉思路。
这里还有一个动态规划背包问题的比较好的资源,请戳这里.

LeetCode05

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.


Example 1:
Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.

貌似字符串问题中,有好多都是动态规划类问题,比如经典的最大相同子串,以及这道最长回文子串。
最开始,我想到的思路是:类似最大相同子串的方法,对于二维数组dp[i][j],i用字符串的正序,j用字符串的倒序,如果str[i] == str[j] 并且dp[i - 1] [j - 1] 不为0的话,则最长回文子串长度就是dp[i-1]+dp[j-1],对于题目提供的样例,这个方法做出来是对的,但是在测评的时候,有一个样例,“abcefcba”就不对。
所以这种思路被抛弃。
结合在discussion部分看到别人的代码,思路是这样的。dp数组为boolean类型,代表从i 到 j位置的字符串是否为回文。如果从 j 到 i 为回文子串,那么它的子问题就是str[i]==str[j]并且由j+1 到 i- 1也是回文子串。因此状态转移方程就为:

dp[i][j]=truetruefalse,ifdp[j+1][i1]=trueandstr[i]==str[j],ij<=2andstr[i]==str[j],elsedp[i][j]={true,ifdp[j+1][i−1]=trueandstr[i]==str[j]true,i−j<=2andstr[i]==str[j]false,else

代码如下:

class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        int max = 0;
        int start = 0;
        int end = 0;
        for(int i = 0; i < len; i++){
            for(int j = 0; j <= i; j++){
                if(s.charAt(i) == s.charAt(j) && (i - j <= 2 || dp[j+1][i - 1])){
                    dp[j][i] = true;
                }
                if(dp[j][i] && max < (i - j + 1)){
                    max = i - j + 1;
                    start = j;
                    end = i+1;
                }
            }
        }
        return s.substring(start, end);
    }
}
目录
相关文章
|
8月前
|
算法
leetcode:389. 找不同
leetcode:389. 找不同
38 0
|
8月前
leetcode-827:最大人工岛
leetcode-827:最大人工岛
73 0
|
8月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
90 0
|
Python
LeetCode 1904. 你完成的完整对局数
一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。
110 0
|
索引
|
存储 Python
LeetCode 66. Plus One
给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身。
100 0
LeetCode 66. Plus One
|
存储
leetcode第52题
可以发现对于同一条副对角线,row + col 的值是相等的。 对于同一条主对角线,row - col 的值是相等的。 我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。 对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。
leetcode第52题
leetcode第51题
较经典的回溯问题了,我们需要做的就是先在第一行放一个皇后,然后进入回溯,放下一行皇后的位置,一直走下去,如果已经放的皇后的数目等于 n 了,就加到最后的结果中。然后再回到上一行,变化皇后的位置,然后去找其他的解。 期间如果遇到当前行所有的位置都不能放皇后了,就再回到上一行,然后变化皇后的位置。再返回到下一行。 说起来可能还费力些,直接看代码吧。
leetcode第51题
leetcode第48题
将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。 解法一 可以先转置,然后把每列对称交换交换一下
leetcode第48题