LeetCode刷题实录Python篇(二)

132 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

30. 串联所有单词的子串

题目 给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"] 输出:[0,9] 解释: 从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。 输出的顺序不重要, [9,0] 也是有效答案。 示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"] 输出:[] 示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"] 输出:[6,9,12]

提示:

1 <= s.length <= 104 s 由小写英文字母组成 1 <= words.length <= 5000 1 <= words[i].length <= 30 words[i] 由小写英文字母组成

代码

from collections import Counter

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        s_len = len(s)
        w_len = len(words[0])
        ws_len = len(words)
        ans = []
        for i in range(s_len):
            if i + w_len * ws_len <= s_len:
                cnt = Counter()
                for j in range(i, i + w_len * ws_len, w_len):
                    if s[j:j+w_len] in words:
                        cnt[s[j:j+w_len]] += 1
                    
                for word in words:
                    cnt[word] -= 1
                    if cnt[word] == 0:
                        del cnt[word]
                if len(cnt) == 0:
                    ans.append(i)

        return ans

视频

www.bilibili.com/video/BV1tU…

513. 找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

在这里插入图片描述

输入: root = [2,1,3] 输出: 1 示例 2:

在这里插入图片描述

输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7

提示:

二叉树的节点个数的范围是 [1,104] -231 <= Node.val <= 231 - 1

# 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 findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
        def getLevel(root:Optional[TreeNode], level):
            cur_val, cur_level = root.val, level
            if root.left is not None:
                cur_val, cur_level = getLevel(root.left, level+1)
            if root.right is not None:
                r_val, r_level = getLevel(root.right, level+1)
                if r_level > cur_level:
                    cur_val, cur_level = r_val, r_level
            
            return cur_val, cur_level

        cur_val, cur_level = root.val, 0
        if root.left is not None:
            cur_val, cur_level = getLevel(root.left, 1)
        if root.right is not None:
                r_val, r_level = getLevel(root.right, 1)
                if r_level > cur_level:
                    cur_val, cur_level = r_val, r_level

        return cur_val


视频

www.bilibili.com/video/BV1hL…

1108. IP 地址无效化

题目 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。

所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 "."。

示例 1:

输入:address = "1.1.1.1" 输出:"1[.]1[.]1[.]1" 示例 2:

输入:address = "255.100.50.0" 输出:"255[.]100[.]50[.]0"

提示:

给出的 address 是一个有效的 IPv4 地址

代码

class Solution:
    def defangIPaddr(self, address: str) -> str:
        # 既然python不支持字符串字符的替换,那么就来点python特性的解法
        ip = address.split('.')
        return ip[0] + "[.]" + ip[1] + "[.]" + ip[2] + "[.]" + ip[3]

视频

www.bilibili.com/video/BV1oZ…