滑动窗口:
滑动窗口 一般用来处理字符型问题。我们从题目中可以知道,要寻找的字串长度其实是可以算出来的,因为words列表中,每个单词都必须长度一致,所以子串长度就等于 words中的单词个数*单词的长度 。
如下图:
黑色的是所给的字符串,红色的是子字符串长度。由于红色的是定长,所以把红色的作为窗口,在黑色中一步步滑动就行了。
准备工作:
1. 用字典记录 words列表中的单词。
2. 红色框中,提取单词,长度是words列表中单个单词的长度,然后把提取的单词与字典中的单词比对,看是否有相同,若有,则在红色框中,继续提取下个单词。若无,则退出循环。红框继续向前滑动一个单位。
class Solution:
def findSubstring(self, s: str, words):
if not s or not words:
return []
sLen = len(s)
wordSize = len(words[0])
wordsLen = len(words)
subStrLen = wordSize*wordsLen
dic = {}
res = []
for w in words:
try:
dic[w]+=1
except KeyError:
dic[w] = 1
for i in range(sLen - subStrLen + 1):
dicc = dic.copy()
flag = True
for j in range(i,i+subStrLen,wordSize):
#print(s[j:j+wordSize])
substr = s[j:j+wordSize]
if dicc.get(substr)!=None and dicc[substr]>0:
dicc[substr] -= 1
else:
flag = False
break
if flag == True:
res.append(i)
return res
ss = Solution()
res = ss.findSubstring('wordgoodgoodgoodbestword',["word","good","best","good"])
print(res) #[8]