题目描述
思路解析动画文字版
记住口诀:宝石进集合,石头来查询,命中就加一。下面每一帧都在套它。
先把宝石种类登记进集合。现在读到 jewels[0] = "a",下一帧把它放进去。
"a" 进集合了。集合记的就是「哪些字符算宝石」,以后查一个字符在不在里面非常快。
先把宝石种类登记进集合。现在读到 jewels[1] = "A",下一帧把它放进去。
"A" 进集合了。集合记的就是「哪些字符算宝石」,以后查一个字符在不在里面非常快。
先把宝石种类登记进集合。现在读到 jewels[2] = "b",下一帧把它放进去。
"b" 进集合了。集合记的就是「哪些字符算宝石」,以后查一个字符在不在里面非常快。
宝石集合全部建好了,里面是 "a"、"A"、"b" 三种。接下来从头扫 stones,每块石头都来集合里查一下。
扫到 stones[0] = "A",拿它去宝石集合里问一句:我是宝石吗?
"A" 确实在集合里,是宝石!这块石头标绿,计数加到 1。
扫到 stones[1] = "a",拿它去宝石集合里问一句:我是宝石吗?
"a" 确实在集合里,是宝石!这块石头标绿,计数加到 2。
扫到 stones[2] = "b",拿它去宝石集合里问一句:我是宝石吗?
"b" 确实在集合里,是宝石!这块石头标绿,计数加到 3。
扫到 stones[3] = "C",拿它去宝石集合里问一句:我是宝石吗?
"C" 不在集合里,这块石头不是宝石(注意大小写),标灰跳过,计数还是 3。
扫到 stones[4] = "b",拿它去宝石集合里问一句:我是宝石吗?
"b" 确实在集合里,是宝石!这块石头标绿,计数加到 4。
扫到 stones[5] = "a",拿它去宝石集合里问一句:我是宝石吗?
"a" 确实在集合里,是宝石!这块石头标绿,计数加到 5。
扫到 stones[6] = "Z",拿它去宝石集合里问一句:我是宝石吗?
"Z" 不在集合里,这块石头不是宝石(注意大小写),标灰跳过,计数还是 5。
stones 全部扫完,绿色那 5 块是宝石,灰色的 "C" 和 "Z" 不在集合里。答案就是 5。
边界先想清:大小写不同、全命中、无交集三种情形。
两个高频追问:数组当集合更省空间,套路可迁移到一类「属于某集合」的题。
参考代码
from __future__ import annotationsfrom typing import *from collections import *from functools import *from itertools import *from math import *from heapq import *from bisect import *class Solution: def numJewelsInStones(self, jewels: str, stones: str) -> int: s = set(jewels) return sum(c in s for c in stones)复杂度
- 时间:O(m + n),m 建集合扫 jewels,n 扫 stones,各一遍
- 空间:O(m),集合存 jewels 的字符;数组版固定 128 即 O(1)
易错点
面试追问把动画讲成自己的话
追问不用哈希集合,能不能更省空间?
追问这题的套路还能用在哪些题上?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
在长度 2N 的数组中找出重复 N 次的元素
LeetCode 961 · 简单 · 沿着 数组套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题