《剑指offer》面试题14:字符串中的变位词

"""
题目:输入字符串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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值