leetcode第30题:括号生成

 

 这是目前遇到最难的题,刚开始的思路是:匹配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

 

posted @ 2019-08-30 15:54  耳东三羊  阅读(238)  评论(0编辑  收藏  举报