1、解题思路:若字符串长度相同,依次遍历元素,比较两个字符串的该元素个数是否相同。【耗时长】
知识点:len(...):获取序列(字符串、列表等)长度。
序列.count(...):统计序列中指定元素的个数。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 耗时长
if len(s) != len(t): return False
for x in s:
if s.count(x) != t.count(x): return False
return True
2、解题思路:哈希表。
本题:两个字符串中只有小写字母。可用长度为26的列表。也可用字典(或字典子类)。
(2-1)一个列表。若字符串长度相同,遍历其中一个字符串,记录字母的个数;再遍历另一个字符串,从列表中减去字母的个数,若列表中有元素小于0,则有不一样的字母。
知识点:[ x ] * n:列表中的元素x重复n次,即列表中有n个x。
ord(...):获取字符的ascii值或unicode数值。
注解:res[ord(x) - ord('a')]:列表res中以该字母与字母a的距离(ascii/unicode)作为索引号。
字符串长度相同,若一个字符串有的字母,另一个字符串没有该字母,则列表中某元素必定大于0也必定某元素小于0,因此判断小于0即可。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t): return False
res = [0] * 26
for x in s:
res[ord(x) - ord('a')] += 1
for y in t:
res[ord(y) - ord('a')] -= 1
if (res[ord(y) - ord('a')]) < 0: return False
return True
(2-2)若字符串长度相同,同时遍历两个字符串,其中一个字符串记录字母的个数,另一个字符串从列表中减去字母的个数,若两个字符串中字母个数都相同,最终列表中只有元素0。
① 一个列表。
知识点:zip(a,b):将多个可迭代的对象,按对应位置把元素打包成一个个元组,最终是由元组组成的列表。
set(...):转为集合。集合中的元素不重复(即去重)。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t): return False
res = [0] * 26
for x,y in zip(s,t):
res[ord(x) - ord('a')] += 1
res[ord(y) - ord('a')] -= 1
if len(set(res)) != 1: return False
return True
② 一个字典。
知识点:collections.defaultdict(...):字典子类。参数为工厂函数,例如:int。
字典.values():返回可迭代的字典中所有值。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
from collections import defaultdict
if len(s) != len(t): return False
res = defaultdict(int)
for x,y in zip(s,t):
res[x] += 1
res[y] -= 1
if len(set(res.values())) != 1: return False
return True
(2-3)若字符串长度相同,遍历两个字符串,分别统计各字母的个数,判断两个列表是否相同。
① 两个列表。
注解:res1, res2 = [0] * 26, [0] * 26 :即res1,res2都是有26个0的列表,[0,0,...0]。
return res1 == res2 :若res1的值和res2的值相同,返回True,不同返回False。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t): return False
res1, res2 = [0] * 26, [0] * 26
for x,y in zip(s,t):
res1[ord(x) - ord('a')] += 1
res2[ord(y) - ord('a')] += 1
return res1 == res2
② 两个字典。
知识点:字典[键]:获取键对应的值。可赋值,即字典[键]=值。
字典.get(键,默认值):获取键的值,若没有该键,返回默认值。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t): return False
res1 = {}
res2 = {}
for x in s:
res1[x] = res1.get(x,0) + 1
for y in t:
res2[y] = res2.get(y,0) + 1
return res1 == res2
3、解题思路:若字符串长度相同,分别用计数器记录字母出现的次数,判断计数器是否相同。
知识点:collections.Counter():字典子类。计数器,以字典形式记录元素以及其个数。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
from collections import Counter
if len(s) != len(t): return False
return Counter(s) == Counter(t)
4、解题思路:排序。若字符串长度相同,分别将两个字符串排序后,判断是否相同。
知识点:sorted(...):将序列(字符串、列表等)排序,返回排序后的新列表。
operator.eq(a,b):比较两个字符串、列表等是否相等。与a==b相同。
补充:operator 模块提供了一套与 Python 的内置运算符对应的高效率函数。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t): return False
return sorted(s) == sorted(t)
# 或者
from operator import eq
if len(s) != len(t): return False
return eq(sorted(s),sorted(t))
注:先判断两个字符串的长度是否相同,若相同,再比较字母。可提高一点速度。