"""
题目:输入字符串S1和S2,如何判断字符串S2中是否包含字符串S1的变位词?
变位词又称兄弟词,即两个字符串的字母、个数一模一样,如'pots','stop','tops'相互就是变位词
作者解答思路:书上包括网上,都是用一个26个字母的哈希表去记录每个字母出现的次数,key为字母,value为这个字母出现的次数。value默认为0
然后遍历S1,将哈希表中S1中出现的字母的value修改为它们出现的次数(我把这步称为哈希表初始化),
然后使用双指针截取S2的子字符串(定义为S3,S3长度与S1相同),逐个遍历S3,并将哈希表中S3出现的字母的value都减去它出现的次数,
如果遍历完后,哈希表中的value都是0了,则说明这个S3就是S1的变位词。
如果判断S3不是S1的变位词,则将哈希表要重新初始化,然后双指针移动继续截取子字符串,如此循环直到结束。
我的解答思路:首先将S1转化为列表T1(我称之为列表初始化)
然后使用双指针截取S2中的子字符串(定义为S3,S3长度与S1相同),逐个遍历S3中的字母,
如果这个字母在T1中出现了,则T1使用remove方法删除这个字母
遍历完S3后,如果T1的长度为0,则认为S3就是S1的变位词。
如果判断S3不是S1的变位词,则将列表T1重新初始化,然后双指针移动继续截取子字符串,如此循环直到结束。
"""
def has_brother(s1, s2):
s1_length = len(s1)
max_k = len(s2) - s1_length + 1
for k in range(max_k):
s1_copy_list = list(s1)
p1 = k
p2 = p1 + s1_length
sub_string = s2[p1:p2]
for s in sub_string:
if s in s1_copy_list:
s1_copy_list.remove(s)
if len(s1_copy_list) == 0:
return True
return False
s1 = 'pots'
s2 = 'stopsssss'
s3 = 'sdsastop'
s4 = 'sdsstopsdd'
s5 = 'sdsdstwop'
print(has_brother(s1, s2))
print(has_brother(s1, s3))
print(has_brother(s1, s4))
print(has_brother(s1, s5))
03-02
206
01-25
613