Description
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.
Example
Example 1:
Input:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
Output: [0,9]
Explanation: Substrings starting at index 0 and 9 are “barfoo” and “foobar” respectively.
The output order does not matter, returning [9,0] is fine too.
Example 2:
Input:
s = “wordgoodgoodgoodbestword”,
words = [“word”,“good”,“best”,“word”]
Output: []
Submissions
我的解题思路是首先计算words列表中每个单词的长度及单词个数,并将words排序,如果words为空或者长度大于s,则直接返回空。否则遍历s减去words长度的前几个字符,去匹配其中的单词,匹配到时就将单词添加到res列表中,最后将res排序并比较是否和排序的words相同,若相同,则将当前索引i添加到列表l中。循环搜索结束后饭后列表l.
实现代码如下:
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
words = sorted(words)
l = []
if len(words)==0:
return l
e = len(words[0])
w = len(words)
t = e * w
if len(s)<t:
return l
for word in set(words):
for i in range(len(s)-t+1):
res = list()
if s[i:i+e] == word:
for j in range(i,i+t,e):
res.append(s[j:j+e])
res = sorted(res)
if res == words:
l.append(i)
return l