题目描述
思路解析动画文字版
记住「① 字符集合相同 ② 出现次数多重集相同」,两条都过才接近。下面先各自计数,再逐条核对。
第一步:数清 word1 里每种字符出现几次。从左到右扫,每个字符给它的计数加一。
word1 第 0 个字符是 'c',把它的计数加到 1(高亮行)。
word1 第 1 个字符是 'a',把它的计数加到 1(高亮行)。
word1 第 2 个字符是 'b',把它的计数加到 1(高亮行)。
word1 第 3 个字符是 'b',把它的计数加到 2(高亮行)。
word1 第 4 个字符是 'b',把它的计数加到 3(高亮行)。
word1 第 5 个字符是 'a',把它的计数加到 2(高亮行)。
第二步:同样数清 word2 里每种字符的次数。注意舞台上的数组已切换成 word2。
word2 第 0 个字符是 'a',把它的计数加到 1(高亮行)。
word2 第 1 个字符是 'b',把它的计数加到 1(高亮行)。
word2 第 2 个字符是 'b',把它的计数加到 2(高亮行)。
word2 第 3 个字符是 'c',把它的计数加到 1(高亮行)。
word2 第 4 个字符是 'c',把它的计数加到 2(高亮行)。
word2 第 5 个字符是 'c',把它的计数加到 3(高亮行)。
条件①核对字符 'a':word1 有、word2 有,一致(绿色)。
条件①核对字符 'b':word1 有、word2 有,一致(绿色)。
条件①核对字符 'c':word1 有、word2 有,一致(绿色)。
条件①整体判定:两边用到的字符集合完全相同,第一关通过。
条件②看「次数的多重集」。先把 word1 各字符的次数列出来 [1,2,3],排序成 [1,2,3]。
再把 word2 各字符的次数列出来 [1,2,3],排序成 [1,2,3]。
比较两个排序后的次数列:[1,2,3] 完全相等,第二关也通过。
综合:长度相同、条件①满足、条件②满足,所以两字符串接近,返回 true。
边界先想清:长度不同 false、纯重排 true、频次能互搬 true。
面试重点:把两种操作翻译成两个可判定条件。
参考代码
class Solution: def closeStrings(self, word1: str, word2: str) -> bool: if len(word1) != len(word2): return False a = [0] * 26 b = [0] * 26 for ch in word1: a[ord(ch) - 97] += 1 for ch in word2: b[ord(ch) - 97] += 1 return [x > 0 for x in a] == [x > 0 for x in b] and sorted(a) == sorted(b)复杂度
- 时间:O(n + Σ logΣ),计数 O(n);排序固定 26 个计数,排序项是常数
- 空间:O(1),两个长度 26 的计数数组,与 n 无关
易错点
面试追问把动画讲成自己的话
追问两个条件分别对应哪种操作?
追问能否用一个 26 长数组同时判两条?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
长度为 3 的不同回文子序列
LeetCode 1930 · 中等 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题