Leetcode做题日记:30. 与所有单词相关联的字串(PYTHON)

给定一个字符串 s 和一些长度相同的单词 words。在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

示例 1:
输入:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
输出: [0,9]
解释: 从索引 0 和 9 开始的子串分别是 “barfoor” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案。

示例 2:
输入:
s = “wordgoodstudentgoodword”,
words = [“word”,“student”]
输出: []

第一次的代码,击败4.85%。。。
思路很简单,words总共需要zL个字母,在s中截取zL个字母,在这个片段中依次截取Lonew个字母组成的单词,判断是否在words中,为了避免重复,在words中判断过的单词就删除,如果最后words中全部删除,就表示总共截取的这堆字母是正确是,然后再开始下一轮迭代


	if len(words)==0:
            return []
        Lonew=len(words[0]) #记录一个单词的长度
        Lw=len(words)
        zL=Lonew*Lw #需要字母的总长度
        Ls=len(s)
        i=0
        I=[]
        if Ls<zL or Ls==0:
            return I
        while i<=Ls-zL:
            if s[i:i+Lonew] not in words: #加上这个可以加快程序
                i=i+1                     #不然会提前超时
                continue                  #即如果第一个单词就不在words里,就跳过
            S=s[i:i+zL]
            w=words[:]
            for j in range(0,zL,Lonew): #range(,,)不是range(::)
                SS=S[j:j+Lonew]
                if SS in w:
                    w.remove(SS) #一开始写的是w.pop(SS),不行 
                else: #如果不添加这句,永远超时
                    break
            if w==[]:
                I.append(i)
            i=i+1   
        return I 

猜你喜欢

转载自blog.csdn.net/weixin_44033136/article/details/85387931