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

 

转载于:https://www.cnblogs.com/cchenyang/p/11435381.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值