这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
题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
执行结果:
题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
执行结果: