题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的
字母异位词。
s 和 t 仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
思路与算法
问题分析
- 字母异位词:两个字符串中包含的字符及其出现次数完全相同,但顺序可能不同。
- 特殊情况:如果两个字符串长度不同,则必然不可能互为异位词。
解决方法
- 频率统计:利用 Python 内置模块 collections.Counter 对每个字符串的字符进行计数。直接比较两个计数字典是否完全一致即可。
- 如果字符串中包含 Unicode 字符,由于 Counter 可以处理任意可哈希的对象,上述方法仍然适用,无需做额外调整。(字典的键可以是任何字符——包括 Unicode 字符。)
代码
from collections import Counter
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 如果两个字符串长度不同,直接返回false
if len(s) != len(t):
return False
# 统计两个字符串中各个字符的字频
counter_s = Counter(s)
counter_t = Counter(t)
return counter_s == counter_t
总结
- Python 内置模块 collections.Counter
- 定义:Counter 是 collections 模块中的一个子类,继承自 dict。它用于对可迭代对象中的元素进行计数,返回一个字典形式的对象,其中键为元素,值为该元素出现的次数。
- 初始化:
- 可以通过传入一个可迭代对象(例如字符串、列表等)来创建。
- 也可以传入一个映射对象(比如字典)来初始化。
from collections import Counter
# 通过字符串初始化
counter1 = Counter("abracadabra")
print(counter1)
# 输出类似: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
# 通过列表初始化
counter2 = Counter([1, 2, 2, 3, 3, 3])
print(counter2)
# 输出: Counter({3: 3, 2: 2, 1: 1})
# 通过字典初始化
counter3 = Counter({'x': 2, 'y': 3})
print(counter3)
# 输出: Counter({'y': 3, 'x': 2})
- collections.Counter 是处理计数问题的强大工具,掌握它可以大大简化统计数据、判断频率、比较集合等问题的代码。
- 任何可哈希的对象都可以作为 Counter 的元素,例如元组。