当前位置:   article > 正文

[LeetCode解题报告] 30. 串联所有单词的子串_leetcode 30解题

leetcode 30解题

一、 题目

1. 题目描述

  1. 串联所有单词的子串

难度:困难

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

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

示例 1:

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

示例 2:

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

  • 1
  • 2
  • 3

示例 3:

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

  • 1
  • 2
  • 3

提示:

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

2. 原题链接

链接: 30. 串联所有单词的子串

二、 解题报告

1. 思路分析

这题是 438. 找到字符串中所有字母异位词的加强版,区别是单位从字母变成单词。都可以用滑窗做。

  • 这里由于words中每个单词长度相同,设为d,只需要控制滑窗右移时,每次移动d个字母即可,也就是删去一个单词,纳入一个单词。
  • 聪明的小伙伴会考虑了,那么万一正确的串被窗口边缘切开了怎么办。
  • 因此,我们需要多走几遍(遍)滑窗,让滑窗起点在[0,1…d-1]的位置分别开始上述步骤。
  • 很明显,这样的话就可以遍历到所有滑窗,不会漏。
  • 滑窗移动时,用一个字典维护窗口中每个单词出现次数,和words相同的话就是满足题意的情况。

2. 复杂度分析

最坏时间复杂度O(n×d),n是s长度,d是word中单词长度

3. 代码实现

滑动窗口

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        wc = Counter(words)
        n = len(s)
        m = len(words)
        d = len(words[0])
        if n < d*m:
            return []
        ans = []
        for start in range(d):
            cnt = Counter()
            i=j = start
            while j < d*m:
                cnt[s[j:j+d]] += 1
                j += d
            if cnt == wc:
                ans.append(start)
            for j in range(j,n,d):
                if j+d>n:
                    break
                cnt[s[j:j+d]] += 1
                l = s[i:j-d*m+d]
                cnt[l] -= 1
                if cnt[l] == 0:
                    del cnt[l]
                # print(j,cnt)

                i += d
                if cnt == wc:
                    ans.append(i)
        return ans
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

三、 本题小结

  1. 滑窗的灵活运用。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/681294
推荐阅读
相关标签
  

闽ICP备14008679号