Python描述 LeetCode 30. 串联所有单词的子串

Posted 亓官劼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python描述 LeetCode 30. 串联所有单词的子串相关的知识,希望对你有一定的参考价值。

Python描述 LeetCode 30. 串联所有单词的子串

  大家好,我是亓官劼(qí guān jié ),在【亓官劼】公众号、CSDN、GitHub、B站等平台分享一些技术博文,主要包括前端开发、python后端开发、小程序开发、数据结构与算法、docker、Linux常用运维、NLP等相关技术博文,时光荏苒,未来可期,加油~

  如果喜欢博主的文章可以关注博主的个人公众号【亓官劼】(qí guān jié),里面的文章更全更新更快。如果有需要找博主的话可以在公众号后台留言,我会尽快回复消息.


本文原创为【亓官劼】(qí guān jié ),请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 全部文章请关注微信公众号【亓官劼】。

题目

给定一个字符串 s 和一些 长度相同 的单词 words **。**找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。

示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]

示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 30
  • words[i] 由小写英文字母组成

解题思路

滑动窗口。字典记录words中每个单词的次数,然后以整个words的长度作为一个窗口,每次移动一个word单词长度的距离,这里要注意,计算单词数量的时候不能用count,防止交叉导致的错误,直接使用字符串截断

Python描述

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        
        # 滑动窗口,每次移动一个word_len的窗口
        word_dict = 
        target_word_dict = 
        word_len = len(words[0])
        words_len = word_len * len(words)
        n = len(s)
        res = []
        for item in words:
            target_word_dict[item] = target_word_dict.get(item,0)+1
        for i in range(word_len):
            if i > n - words_len:
                break
            j = i
            word_dict = 
            for w in range(len(words)):
                word_dict[s[i+w*word_len:i+(w+1)*word_len]] = word_dict.get(s[i+w*word_len:i+(w+1)*word_len],0) + 1
            while j <= n - words_len:
                flag = True
                for word,cnt in target_word_dict.items():
                    if word_dict.get(word,0) != cnt:
                        flag = False
                        break
                if flag:
                    res.append(j)
                word_dict[s[j:j+word_len]] -= 1
                j += word_len
                if j + words_len <= n:
                    word_dict[s[j+words_len-word_len:j+words_len]] = word_dict.get(s[j+words_len-word_len:j+words_len],0) + 1
        return res
                

以上是关于Python描述 LeetCode 30. 串联所有单词的子串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 30 串联所有单词的子串

算法leetcode|30. 串联所有单词的子串(rust重拳出击)

算法leetcode|30. 串联所有单词的子串(rust重拳出击)

算法leetcode|30. 串联所有单词的子串(rust重拳出击)

Leetcode 30. 串联所有单词的子串

leetcode30——串联所有单词的字串