【LeetCode】30. Substring with Concatenation of All Words 解题报告(Python)

题目分析:

这一题是有一点难度,它的意思是给定一个字符串s和一些长度相同的单词words。在s中找出可以恰好串联 words中所有单词的子串的起始位置。注意子串要与words中的单词完全匹配,中间不能有其他字符,但不需要考虑words中单词串联的顺序。
比如:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
Output: [0,9]

代码说明:

先使用一个字典统计一下words中每个单词的数量。由于每个单词的长度一样,以题中给的例子而言,可以3个字母3个字母的检查,如果不在字典中,则break出循环。有一个技巧是建立一个临时字典curr,用来统计S中那些在L中的单词的数量,必须和L中单词的数量相等,否则同样break。在代码中也都有注释,这里不再详细说明。

测试代码:

class Solution:
    def findSubstring(self, s, words):
        res, dict = [], {}
        word_num= len(words)
        length_s = len(s)
        if words != []:
            length_word = len(words[0])
        else:
            return res
        #统计单词出现次数
        for i in range(word_num):
            if words[i] in dict:
                dict[words[i]] += 1
            else:
                dict[words[i]] = 1
        #关于这个for里面的+1,你可以假设length_s与word_num * length_word一样那么很明显应该进入循环判断
        for i in range(length_s - word_num * length_word + 1):
            #curr用来统计小循环内出现相同单词次数,如果大于单词组内该单词出现数直接break
            curr, j = {}, 0
            #小循环,j相当于指向一个单词,每次移动一个单词,截取s内一个单词的长度判断是都在dict中
            while j < word_num:
                word = s[i + j * length_word: i + (j + 1) * length_word]
                if not word in dict:    break
                if not word in curr:    curr[word] = 1
                else:   curr[word] += 1
                if curr[word] > dict[word]: break
                j += 1
            #出小循环后j(单词数)等于单词数组数那就是刚好匹配,保存i
            if j == word_num: res.append(i)
        return res

print(Solution().findSubstring('barfoothefoobarman',  ['foo','bar']))	#提交时请删除该行

参考博客

猜你喜欢

转载自blog.csdn.net/L141210113/article/details/88362793