题目
You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
For example, given:
s: “barfoothefoobarman”
words: [“foo”, “bar”]
You should return the indices: [0,9].
(order does not matter).
题目要求
给定一个字符串s和一个字符串列表words。找出字符串s中所有用words中的所有单词拼接的到的子串。参考给出的例子。
解题思路
这道题的解题思路参考南郭子綦.
用字典来统计words中每个单词出现的次数。因为words中的单词都是相同大小的,所以可以直接从s中截取固定大小的子串判读是否在words中出现。本实现应用了一个小的trick,用一个临时的字典来纪录每次匹配出现的word的数量,通过与words中每个单词出现的数量做对比提升代码的速度。
代码
class Solution(object):
def findSubstring(self, s, words):
""" :type s: str :type words: List[str] :rtype: List[int] """
if len(words) == 0:
return []
wordsMap = {}
for word in words:
if word not in wordsMap:
wordsMap[word] = 1
else:
wordsMap[word] += 1
word_len = len(words[0])
word_size = len(words)
ans = []
for i in range(len(s) - word_len * word_size + 1):
j = 0
cur_dict = {}
while j < word_size:
word = s[i + word_len * j:i + word_len * j + word_len]
if word not in wordsMap:
break
if word not in cur_dict:
cur_dict[word] = 1
else:
cur_dict[word] += 1
if cur_dict[word] > wordsMap[word]:
break
j += 1
if j == word_size:
ans.append(i)
return ans