本想写个方法实现统计两个字符数组是否含有相同字符
代码片段
def check_if_anagrams(self,s1,s2):
if s1==s2:
return True
if len(s1)!=len(s2):
return False
if len(s1)==1 and len(s2)==1 and s1 !=s2:
return False
s1_dic={ k:0 for k in range(len(s1))}
s2_dic={k:0 for k in range(len(s1))}
for i in range(len(s1)):
s1_dic[s1[i]]=1
s2_dic[s2[i]]=1
if s1_dic==s2_dic:
return True
else:
return False
其中以下代码片段,运行起来没有问题。
s1_dic={ k:0 for k in range(len(s1))}
s2_dic={k:0 for k in range(len(s1))}
for i in range(len(s1)):
s1_dic[s1[i]]=1
s2_dic[s2[i]]=1
但是逻辑有些问题,包含相同字符的时候无法准确统计,比如
s1=“aab”
s2=“abb”
以上逻辑无法判断。这个时候,我想到改统计方法
s1_dic={ k:0 for k in range(len(s1))}
s2_dic={k:0 for k in range(len(s1))}
for i in range(len(s1)):
s1_dic[s1[i]]+=1
s2_dic[s2[i]]+=1
但是就会一直报错。报错内容
KeyError: 'a'
开始思考,是不是字符作为key行不通。转念又一想不对啊,第一次跑通了。后来才发现,是初始化赋值的时候,赋值的key是1,2,3.。。数值。应该赋值为数组里的字符。
代码修改为以下就没报错:
s1_dic={ k:0 for k in s1}
s2_dic={k:0 for k in s2}
for i in range(len(s1)):
key1=s1[i]
key2=s2[i]
s1_dic[key1]+=1
s2_dic[key2]+=1
另外。比较两个字典内容是否相同,使用==就可以。贴上完整代码:
letcode 438题 找到字符串中所有字母异位词
题目描述:
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
说明:
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
示例 1:
输入:
s: "cbaebabacd" p: "abc"
输出:
[0, 6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。
示例 2:
输入:
s: "abab" p: "ab"
输出:
[0, 1, 2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。