跟着leedcode刷算法 -- 动态规划1

100 阅读1分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

image.png

题1

至少有K个重复字符的最长子串

给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。

示例 1:

  • 输入:s = "aaabb", k = 3

  • 输出:3

  • 解释:最长子串为 "aaa" ,其中 'a' 重复了 3 次。 示例 2:

  • 输入:s = "ababbc", k = 2

  • 输出:5

  • 解释:最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。  

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文字母组成
  • 1 <= k <= 105 相关标签
  • 哈希表
  • 字符串
  • 分治
  • 滑动窗口

思路: 第一想法是用滑动窗口,但是发现比较难去实现,最后还是翻看了一些大佬们的解题方法,借鉴了一些思路,然后去实现了一下,效率还是蛮高的

class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        if len(s) < k:
            return 0
        for row in set(s):
            if s.count(row) < k:
                return max(self.longestSubstring(t, k) for t in s.split(row))
        res = len(s)
        return res

执行结果:

image.png

题2

二叉树中的最大路径和

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例 1:

  • 输入:root = [1,2,3]

  • 输出:6

  • 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6 示例 2:

  • 输入:root = [-10,9,20,null,null,15,7]

  • 输出:42

  • 解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

  • 树中节点数目范围是 [1, 3 * 104]
  • -1000 <= Node.val <= 1000 相关标签
  • 深度优先搜索
  • 动态规划
  • 二叉树

本题思路: dfs 递归 深度优先

这种需要查找路径的题基本思路就是直接写dfs 直接看代码吧

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxPathSum(self, root: Optional[TreeNode]) -> int:
        self.res = float('-inf')
        def dfs(root):
            if not root:
                return 0
            right = dfs(root.right)
            left = dfs(root.left)
            self.res = max(self.res, left + right + root.val)
            return max(0, max(left, right) + root.val)
        dfs(root)
        return self.res

执行结果:

image.png