Find All Anagrams in a String

本文提供了一种解决LeetCode题目“查找字符串的所有排列”的方法。通过定义类`Solution`及方法`findAnagrams`来找出一个字符串中所有是另一个字符串的字母异位词的子串起始索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目详情:https://leetcode.com/problems/find-all-anagrams-in-a-string/description/

超时了好几次,终于做对了。

# -*- coding:utf-8 -*-
class Solution(object):
    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """
        result=[] #用来存储结果
        i=0 #遍历开始的下标
        slength,plength=len(s),len(p) #得到两者的长度
        while i < slength:
            print i
            if self.detectAnagram(s,p,i) == True: #检测从i开始的,plength个元素是否为Anagram
                result.append(i) #是的话,添加到result中
            #以下为改变下标i
            if i+plength<slength and s[i+plength] not in p:#比如:s='abceabc',p='abc'
                i=i+plength+1 #那么直接将i改为i+plength+1,因为e不在p中,i只要小于i+plength+1都不会相等
            elif i+plength<slength and s[i]==s[i+plength]:#该条主要判断s中有循环的情况,比如:
                i+=1#s="abcdabcdabcdabcdabcd",p="abcd";处理这种情况,依次将i往后移,并添加到result中
                while i+plength<slength and s[i]==s[i+plength]: #直到i+plength<slength或者s[i]==s[i+plength]
                    result.append(i) #两者之一不满足,退出循环
                    i+=1
            elif i+plength>slength: #这条判断s从位置i开始不能取plength个元素了,那么直接结束
                break
            else: #其余情况简单的将i加1
                i=i+1
        return result

    def detectAnagram(self,s,p,pos):
        temp=s[pos:pos+len(p)] #取得从pos到pos+len(p)之间的元素,不包括pos+len(p)位置上元素
        if set(temp)!=set(p) or len(temp)!=len(p): #如果把重复元素去掉之后,长度不相等或者
            return False #不去重两者的长度就不相等,那么直接返回False值
        for e in set(temp): #元素去重,并依次取出里面的元素
            if temp.count(e)!=p.count(e) : #如果某一元素在temp和p中的个数不相等
                return False#返回false值
        return True#执行到这,说明是Anagram
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值