目录
字母异位词
思路:
1.判断两个字符串的长度是不是一样
2.先用一个数据容器存起来A字符串的所有字符,
再看看有没有存在B中有的字母,A没有的这种情况
3.处理字母频率
注意:
1.Python中True和False是布尔类型的值,首字母需要大写,否则会报错
2.else后面的
代码逻辑问题:
1. 这个version中如果在else模块中写了return True,这样会导致即使后面存在t字符串中有字符并不在List_A中的情况,也会return True,导致一些不合格的字符串并没有检测出来,因此有部分案例未通过
List_A=[]
if len(s)!=len(t):
return False
else:
for char in s:
List_A.append(char)
for char in t:
if char not in List_A:
return False
else:
return True
2. 字母异位词中相同字母要求出现的频率也一样,以下这段代码只保证了两组的字母个数和字母都是一样的,但没有保证相同字母出现的频率是一样的。如案例 "aacc" "ccac"由于a,c出现的频率不一致,不是字母异位词,但因为缺少判断而误判作True
List_A=[]
if len(s)!=len(t):
return False
else:
for char in s:
List_A.append(char)
for char in t:
if char not in List_A:
return False
else:
pass
return True
修复过程:
1. 不再把列表初始化为空 List_A=[ ],然后再通过append()方法添加列表元素,而是直接把字符串s转化转化为字符列表 即 List_A=list(s)
2. 字符频率的处理:这里通过remove()函数原地改变列表,移除数据容器List_A的元素筛选出频率一致的词。
个人理解可以认为其是一种抵消,如果满足字母异位词的条件,List_A最终应该被抵消完全。 如果还有剩下的,说明是多余出来的字母,恰好证明频率不一致。
3.遍历t字符串的过程中,if 代码块修改为字符在List_A中的情况
4.字母出现频率一致是比char in List_A更强的条件
5.报错代码:return False去掉return
return True if not List_A else return False
6.将s字符串转化为列表直接写
List_A=list(s)
无需写遍历
for char in s:
List_A=list(s)
最终代码:
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(s)!=len(t):
return False
else:
List_A=list(s)
for char in t:
if char in List_A:
List_A.remove(char)
else:
return False
return True if not List_A else False