这是目前遇到最难的题,刚开始的思路是:匹配words中元素是否在s中,若在找所在元素的后words长度位的字符串,判断words其他元素是否都在s中。
看似这个思路可行,实际上存在的问题:
1.words是列表,无序,题中words组成的字符串可以随机组合,若words元素个数>4,很难列举出所有字符串
2.用上述思路时间复杂度将会很高
因此,我想到了滑动窗口法:
滑动窗口法可以用于解决字符串匹配,数组求K个元素最大值等问题
该算法展示了如何将嵌套for循环在少数问题中转换为单个for循环,从而减少了时间的复杂性。
但是仍然有一个问题没有解决:words数组是可以无序组成字符串
这里我们可以使用将数组转为字典,用判断字典是否相等来判断结果
class Solution: def findSubstring(self, s: str, words: List[str]) -> List[int]: if not s or not words or len(words)*len(words[0])>len(s):return lenw = len(words[0]) # words中单个元素长度 len_all = lenw *len(words) # words中所有元素的长度之和 n = len(s) # s的长度 # 用字典索引的方法来求 res = [] words_dict = {} # 把words转变为字典 for i in words: if i in words_dict: words_dict[i] += 1 else: words_dict[i] = 1 for i in range(n-len_all+1): # 长度与索引之间差1 滑动窗口法 temp = s[i:i+len_all] temp_dict = {} for j in range(0,len_all,lenw): k = temp[j:j+lenw] if j in temp_dict: temp_dict[j] +=1 else: temp_dict[j] = 1 if temp_dict == words_dict: res.append(i) return res