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

 

posted @ 2020-05-12 12:45  nil_f  阅读(115)  评论(0编辑  收藏  举报