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. 串联所有单词的子串(rust重拳出击)
算法leetcode|30. 串联所有单词的子串(rust重拳出击)