leetcode 每日一题 30. 串联所有单词的子串
滑动窗口法
思路:
由于给定words列表中每个单词长度是一样的,则我们可以通过单词个数乘以长度得到要比对子串的长度,然后在原始字符串不断滑动比对。找到每个子串后,可以将子串按照单词长度拆分变成数组,只需要比对拆分后的数组中元素是否和words中一致即可。
代码:
class Solution: def findSubstring(self, s: str, words: List[str]) -> List[int]: if not s or not words: return [] strlen = len(s) listlen = len(words) wordlen = len(words[0]) sbstrlen = listlen * wordlen result = [] for i in range(strlen-sbstrlen+1): tempStr = s[i:i+sbstrlen] tempArray = [] for j in range(0,sbstrlen-wordlen+1,wordlen): tempArray.append(tempStr[j:j+wordlen]) isin = True for word in words: if word not in tempArray: isin = False break else: tempArray.remove(word) if isin: result.append(i) return result