给定一个字符串 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