题目
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 “barfoor” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2:
输入:
s = “wordgoodgoodgoodbestword”,
words = [“word”,“good”,“best”,“word”]
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
类似尺取法,假设word单词长度为s 我们就每s段分成一个单词,每次分的第一单词头为1到s-1,这样,我们就取到了所有单词,之后map(dict)记录下单词出现数量之后尺取知道tmpdic==dic就为其中一个答案
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
if len(words)==0:
return []
l_w=len(words[0])
l_s=len(s)
dic={}
tmpdic={}
ans=[]
num=len(words)
for word in words:
if word in dic:
dic[word]+=1
else:
dic[word]=1
for i in range(l_w):
tmpdic.clear()
l,r=i,i
tmpnum=0
print(i)
while(i+l_w<=l_s and r+l_w<=l_s):
if s[r:r+l_w] not in tmpdic:
tmpdic[s[r:r+l_w]]=1
else:
tmpdic[s[r:r+l_w]]+=1
tmpnum+=1
if s[r:r+l_w] not in dic:
tmpnum=0
tmpdic.clear()
l=r+l_w
else:
#print(dic,tmpdic,num,tmpnum)
#print(l,r)
if tmpdic[s[r:r+l_w]] == dic[s[r:r+l_w]] and tmpnum==num:
#print("yes")
ans.append(l)
tmpdic[s[l:l+l_w]]-=1
l=l+l_w
tmpnum-=1
elif tmpdic[s[r:r+l_w]] < dic[s[r:r+l_w]]:
pass
else:
while(tmpdic[s[r:r+l_w]]>dic[s[r:r+l_w]]):
tmpdic[s[l:l+l_w]]-=1
l+=l_w
tmpnum-=1
if tmpdic[s[r:r+l_w]] == dic[s[r:r+l_w]] and tmpnum==num:
print("yes")
ans.append(l)
tmpdic[s[l:l+l_w]]-=1
l=l+l_w
tmpnum-=1
r=r+l_w
return ans