题目描述
给定一个字符串 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”]
输出:[]
解题思路:
1、由于words中所有子串长度相等(记为length),因此可以循环遍历s,如果s中 s[当前位置 i : 当前位置 i + length] 在words中,则创建words数组的拷贝temp,并移除temp中等于s[i : i + length]的子串:
while i < len(s):
if s[i: i + length] in words:
j = i + length
temp = [ele for ele in words]
temp.remove(s[i: i + length])
2、令 j = i + length,然后继续循环遍历s, 若s[j: j + length]在words中,则从temp中移除s[j: j + length],否则令j=len(s),跳出while循环:
while j < len(s):
if s[j: j + length] in temp:
temp.remove(s[j: j + length])
j += length
else:
j = len(s)
3、最后,若temp数组为空,则将i添加到result数组中,并令i += 1,否则直接令i += 1:
if len(temp) == 0:
result.append(i)
i += 1
else:
i += 1
PS:本解题方法还存在很多可以改进的地方,因为执行用时太高了。
完整代码
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
if not s or not words or len(words) > len(s):
return []
result = []
length = len(words[0])
i = 0
while i < len(s):
if s[i: i + length] in words:
j = i + length
temp = [ele for ele in words]
temp.remove(s[i: i + length])
while j < len(s):
if s[j: j + length] in temp:
temp.remove(s[j: j + length])
j += length
else:
j = len(s)
if len(temp) == 0:
result.append(i)
i += 1
else:
i += 1
else:
i += 1
return result