给定两个字符串s和t,写一个函数用于判断t是否是s的字母异位词
Example 1:
Input: s = "anagram", t = "nagaram" Output: true
Example 2:
Input: s = "rat", t = "car" Output: false
注意:
你可以假设字符串只包含小写字母
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
1:该题的本质是考察两个字符串的字母种类和字母对应数量是否相同,相同即是有效的字母异位词。比如例1,s字符串和t字符串,a、n、g、r、m的个数均分别为3、1、1、1、1,所以结果为True
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(s) != len(t):
return False
chaDic = {}
for i in s:
chaDic[i] = chaDic.get(i, 0) + 1
for i in t:
if i not in chaDic:
return False
else:
if chaDic[i] == 1:
del chaDic[i]
else:
chaDic[i] -= 1
return chaDic == {}
2:用set()方法,过滤s字符串中重复的字母,生成彼此不重复的集合L。访问L集合,判断每个字母在s和t字符串中的数量是否相等,进行对应的操作(参考他人)
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(s) != len(t):
return False
for i in set(s):
if s.count(i) != t.count(i):
return False
return True
优雅的写法(参考他人)
all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
元素除了是 0、空、FALSE 外都算 TRUE。
函数等价于:
def all(iterable): for element in iterable: if not element: return False return True
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
return len(s) == len(t) and all([s.count(i) == t.count(i) for i in set(s)])
类似的写法,因为字符串只包括小写字母(参考他人)
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
chaStr = "qwertyuiopasdfghjklzxcvbnm"
if len(s) != len(t):
return False
for i in chaStr:
if s.count(i) != t.count(i):
return False
return True
算法题来自:https://leetcode-cn.com/problems/valid-anagram/description/