给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。 返回所有串联字串在 s 中的开始索引。你可以以 任意顺序 返回答案。
时间: 2023-07-08 09:52:46 浏览: 157
这是一个经典的字符串问题,可以使用滑动窗口和哈希表来解决。
具体实现如下:
1. 首先将 words 数组中的所有字符串存入哈希表中,以便后面用于匹配。
2. 然后使用滑动窗口的思想,从字符串 s 的第一个字符开始,每次向右移动 words 数组中所有字符串的总长度的距离。如果当前子串中包含 words 数组中所有字符串,就将当前子串的起始位置存入结果数组中。
3. 在每次移动滑动窗口时,需要先将窗口左端点对应的单词从哈希表中删除,再将窗口右端点对应的单词加入哈希表中。这样可以保证每次匹配的单词在哈希表中。
4. 如果当前子串中包含 words 数组中所有字符串,需要先将子串中所有单词存入哈希表中,再与 words 数组中的单词进行比较,以保证子串中包含 words 数组中所有单词。
Python 代码如下:
```python
def findSubstring(s: str, words: List[str]) -> List[int]:
if not s or not words:
return []
word_len = len(words[0])
total_len = len(words) * word_len
word_dict = {}
for word in words:
if word not in word_dict:
word_dict[word] = 1
else:
word_dict[word] += 1
res = []
for i in range(len(s) - total_len + 1):
cur_dict = {}
j = i
while j < i + total_len:
cur_word = s[j:j+word_len]
if cur_word not in word_dict:
break
if cur_word not in cur_dict:
cur_dict[cur_word] = 1
else:
cur_dict[cur_word] += 1
if cur_dict[cur_word] > word_dict[cur_word]:
break
j += word_len
if j == i + total_len:
res.append(i)
return res
```
其中,word_dict 是存储 words 数组中所有字符串的哈希表,cur_dict 是存储当前子串中所有字符串的哈希表。在每次移动滑动窗口时,需要将相应的单词从哈希表中删除或加入。
阅读全文