动态规划—最长回文子串LEETCODE第5题深度剖析

动态规划对于笔者来说有很重要的意义

一、题目如下:

对于此类题目,笔者常用的的办法是先做个暴力解题思路,然后再对暴力法进行优化。

二、暴力法

//字串遍历
public static String longestPalindrome(String s) {
   String result="";
    if(s.length()==1) return s;
for(int i=0;i<s.length();i++) {
for(int j=i+1;j<s.length()+1;j++) {if(test(s.substring(i,j))&&s.substring(i,j).length()>result.length())result=s.substring(i,j);}}
return result;}
//回文判断
public static boolean test(String str)
{for(int i=0;i<str.length()/2;i++) {if(str.charAt(i)!=str.charAt(str.length()-1-i))
return false;}
return true;
}

这段代码虽然不出意外的超时了,但是确实是我们第一步要考虑的。这个暴力法很简单,一个一个字串的检测,直到检测完所有的字符串。可是这不是我们想要的。

三、动态规划方法

首先要修改的就是我们的第一个字符串遍历的方法。思路为,既然我们知道了一个串为回文,那这个串左字母和右字母如果相同的话,不就又是一个回文字符串了吗。

不过这个思路要解决的问题有俩个:

1.找到所有起始字符串,并且将这些字符串下标保存到ArrayList数组里面

2.对每个字符串进行动态扩张。扩张到不能再扩为止。

public static String longestPalindrome(String s) {
        //定义一个结构保存所有字串
        class Str{
            Str(int i,int j){
                this.i=i;
                this.j=j;
            }
            int i;
            int j;
        }
        if(s.length()==1) return s;
        ArrayList<Str> al =new ArrayList<>();
        for(int i=0;i<s.length();i++) {
            Str str = new Str(i,i);
            al.add(str);
            if(i!=s.length()-1) {
                if(s.charAt(i)==s.charAt(i+1)) {
                    Str str2 = new Str(i,i+1);
                    al.add(str2);
                }
            }
        }
        Str large = new Str(0,0);
        for(Str str:al) {
            while(str.i!=0&&str.j!=s.length()-1) {
                if(s.charAt(str.i-1)==s.charAt(str.j+1)) {
                    str.i--;
                    str.j++;
                }else {
                    break;
                }
            }
            if((str.j-str.i)>=(large.j-large.i)) large=str;
        }
        return s.substring(large.i,large.j+1);

    }

四、笔者对动态规划法的看法。

动态规划没有确切的定义,但拿这题来说,笔者只是把所有需要的数据存储在内存中。再把这些数据拿出来进行动态扩张。

原文地址:https://www.cnblogs.com/godoforange/p/10834657.html

时间: 2024-10-08 01:19:47

动态规划—最长回文子串LEETCODE第5题深度剖析的相关文章

【数据结构与算法】动态规划——最长回文子串

最长回文子串 LeetCode:最长回文子串 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 思想: 动态规划,用boolean[][] dp记录每一对字符是否相等: 双循环遍历所有子串情况,每次遍历时,当前子串首尾相等且内层-1字符串dp值为true,则记录dp值为true:全部遍历完,取最长,即为最

[动态规划]最长回文子串

问题描述: 求一个字符串的最长回文子串,返回这个子串. 这个题目适合用动态规划的方式求解: 代码实现: string longestPalindrome(string s) { int size = s.size(); int dp[1000][1000] = {0}; int left = 0; int right = 0; int len = 0; for(int j = 0; j < size; ++j) { for(int i = 0; i < j; ++i) { if(j - i &

动态规划——最长回文子串

最长回文子串的问题描述: 下面介绍动态规划的方法,使用动态规划可以达到最优的 O(n2) 复杂度. 令 dp[i][j] 表示 S[i] 至 S[j] 所表示的子串是否是回文子串,是则为 1,不是则为 0.这样根据 S[i] 是否等于 S[j] ,可以把转移情况分为两类: 若 S[i] == S[j],那么只要 S[i+1] 至 S[j-1] 是回文子串,S[i] 至 S[j] 就是回文子串:如果S[i+1] 至 S[j-1] 不是回文子串,则 S[i] 至 S[j] 也不是回文子串. 若 S[

动态规划 | 最长回文子串 1040

部分正确(19分)代码: #include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <cstring> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm>

1088 最长回文子串

1088 最长回文子串(51NOD基础题) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5思路:数据比较小,直接分两种情况 bab baab 奇数/偶数回文串 , 一层for枚举中间点

【LeetCode】5# 最长回文子串

题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" 思路 本题运用了一些动态规划的思想,关于动态规划,可以看看我之前的一篇博客了解一下. LeetCode 探索初级算法 - 动态规划 1.首先要找到最简情况.这道题

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

转载:LeetCode:5Longest Palindromic Substring 最长回文子串

本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 求字符串的最长回文子串 算法1:暴

[LeetCode]33. Longest Palindromic Substring最长回文子串

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 解法一:考虑回文字符串paliStr的特征,分为字符串长度为奇偶两种情况:(1)paliStr.size()为奇数时,则从最中间的一个字符往两边扩展是