美文网首页
06-18:刷题综合一:动态规划

06-18:刷题综合一:动态规划

作者: 是黄小胖呀 | 来源:发表于2021-06-19 00:33 被阅读0次

1、最长公共子串

牛客网:最长公共子串

https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac?tpId=191&&tqId=36137&rp=1&ru=/activity/oj&qru=/ta/job-code-high-algorithm/question-ranking

思路1:贪心

1、一个变量来记录最大长度

2、不断去贪心地寻找比最大长度长一的子串是否在另一个字符串中

       res = ""

        maxlen = 0

        for i in range(len(str2)):

            if str2[i-maxlen : i+1] in str1:

                res = str2[i-maxlen:i+1]

                maxlen = maxlen + 1

        return res

思路2:动态规划

1、dp记录最大程度

2、另一个变量记录最大的索引位置

        m=len(str1)

        n=len(str2)

        dp=[[0 for i in range(n+1)] for j in range(m+1)]

        maxlen = 0

        index=0

        for i in range(m):

            for j in range(n):

                if str1[i]==str2[j]:

                    dp[i+1][j+1]=dp[i][j]+1

                    if (maxlen<dp[i+1][j+1]):

                        maxlen=dp[i+1][j+1]

                        index=i+1

        return  str1[index-maxlen:index] if maxlen!=0 else "-1"

2、最长公共子序列(不要求连续)

描述

给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列

class Solution:

    def LCS(self , s1 , s2 ):

        # write code here

        m=len(s1)

        n=len(s2)

        dp=[["" for j in range(n+1)] for i in range(m+1)]

        for i in range(m):

            for j in range(n):

                if s1[i]==s2[j]:

                    dp[i+1][j+1]=dp[i][j]+s1[i]

                else:

                    if len(dp[i][j+1])>len(dp[i+1][j]):

                        dp[i+1][j+1]= dp[i][j+1] 

                    else:

                        dp[i+1][j+1]= dp[i+1][j]

        return  dp[m][n] if dp[m][n]!="" else "-1"

3、最长回文子串

描述

对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

给定字符串A以及它的长度n,请返回最长回文子串的长度。

动态规划:

核心思路:

1、确定回文长度d

2、遍历每一个元素,判断是否能形成回文

3、记录最大值

代码如下:

class Solution:

    def getLongestPalindrome(self, A, n):

        # write code here

            dp=[[False]*n for i in range(n)]

            smax=0

            for d in range(n):

                for i in range(n-d):

                    j=i+d

                    if A[i]==A[j]:

                        if d==0 or d==1 or d==2:

                            dp[i][j]=True

                        else:

                            dp[i][j]=dp[i+1][j-1]

                        if dp[i][j]:

                            smax=max(smax,d+1)

            return  smax

4、最长递增子序列

(1)leetcode上最长子序列长度

动态规划:暴力

贪心+二分:

核心思路

d = []

        for n in nums:

            if not d or n > d[-1]:

                d.append(n)

            else:

                l, r = 0, len(d) - 1

                loc = r

                while l <= r:

                    mid = (l + r) // 2

                    if d[mid] >= n:

                        loc = mid

                        r = mid - 1

                    else:

                        l = mid + 1

                d[loc] = n

        return len(d)

复杂度分析

(2)牛客网上最长子序列

https://www.nowcoder.com/practice/9cf027bf54714ad889d4f30ff0ae5481?tpId=191&&tqId=38003&rp=1&ru=/activity/oj&qru=/ta/job-code-high-algorithm/question-ranking

5、字符串的全排

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=191&&tqId=36141&rp=1&ru=/activity/oj&qru=/ta/job-code-high-algorithm/question-ranking

核心代码如下:

res=[]

        c=list(ss)

        k=len(c)

        if k==1:

            return c

        else:

            for i in range(k):

                first=str(c[i])

                for tmp in self.Permutation(''.join(c[:i]+c[i+1:])):

                    second=''.join(tmp)

                    s=first+second

                    if s not in res:

                        res.append(s)

        return res

相关文章

  • 06-18:刷题综合一:动态规划

    1、最长公共子串 牛客网:最长公共子串 https://www.nowcoder.com/practice/f33...

  • 如何解决动态规划问题

    曾经的我以为动态规划很神秘,很难理解。后来随着刷的动态规划相关的题越来越多,对于动态规划也就驾轻就熟了。我一开始来...

  • leetcode刷题之动态规划

    1,括号生成—— 0022 回溯法数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有...

  • 动态规划入门题——换零钱

    萌新一枚在本校OJ刷题刷到一道动态规划的换零钱问题,看了网上CSDN的一篇文章,算是弄懂了换零钱动态规划的原理吧。...

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • LeetCode 刷题集 - 动态规划(4)

    动态规划定义[https://en.wikipedia.org/wiki/Dynamic_programming]...

  • 动态规划刷题整理(持续更新)

    (持续更新) 奇怪的汉诺塔(4柱汉诺塔) 描述汉诺塔问题,条件如下:1、这里有A、B、C和D四座塔。2、这里有n个...

  • LeetCode刷题笔记(五)动态规划

    五. 动态规划 动态规划的两个核心要素:状态空间和状态方程。 53. 最大子序和 题目:给定一个整数数组 nums...

  • 动态规划之数列的最大和

    Super Jumping! Jumping! Jumping!该题作为动态规划的讲解例子,首先需要明白动态规划问...

  • Leetcode上的dp问题

    下面的题目是我刷的Leetcode上关于动态规划的题目,因为题还没刷完,所以这篇文章会将不时地进行续更

网友评论

      本文标题:06-18:刷题综合一:动态规划

      本文链接:https://www.haomeiwen.com/subject/dcqryltx.html