题目描述
给定一个字符串 s 和一些长度相同的单词 words。在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例
输入:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
输出: [0,9]
解释: 从索引 0 和 9 开始的子串分别是 “barfoor” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案。
解题思路
- 将words列表转换为字典,键为words中的单词,值为出现次数(直接在列表中查找会超时)
- 从可能作为起始位置[0,字符串长度-words中单词串联长度]的索引开始遍历字符串
每次递增长度为单词的长度
若连续匹配完words的所有项,则返回true,否则返回false
class Solution:
def findSubstring(self, s, words):
"""
:type s: str
:type words: List[str]
:rtype: List[int]
"""
result=[]
if len(s)==0 or len(words)==0:
return result
sumWordLen = len(words[0]) * len(words)
if sumWordLen>len(s):
return result
solution=Solution()
wordsDict={}
for word in words:
if word in wordsDict:
wordsDict[word]+=1
else:
wordsDict[word]=1
print(wordsDict)
for i in range(len(s)-sumWordLen+1):
if solution.findSubstringAti(s,wordsDict,i,len(words[0])):
result.append(i)
return result
def findSubstringAti(self,s,pwordsDict,i,wordLen):
wordsDict=pwordsDict.copy()
sumDict=sum(wordsDict.values())
while i<=len(s)-wordLen and sumDict:
word=s[i:i+wordLen]
if word in wordsDict:
if wordsDict[word]>0:
wordsDict[word]-=1
i += wordLen
else:
return False
else:
return False
sumDict = sum(wordsDict.values())
if sumDict:
return False
else:
return True