题目:30. 与所有单词相关联的字串
链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/description/
题目意思很明确啦:
给定一个字符串 s 和一些长度相同的单词 words,找出 s 与 words 中所有单词(words 每个单词只出现一次)串联一起(words中组成串联串的单词的顺序随意)的字符串匹配的所有起始索引,子串要与串联串完全匹配,中间不能有其他字符。
举个例子,给定:
s:"barfoothefoobarman"
words:["foo", "bar"]
你应该返回的索引: [0,9]
。(任意顺序)
没想到特别好的方法,我是将words做成了一个dictionary,然后s从下标0开始去匹配。不过应该会有更好的方式吧。
python:
import collections
class Solution:
def findSubstring(self, s, words):
"""
:type s: str
:type words: List[str]
:rtype: List[int]
"""
def myfindSubstring(str, words):
length = len(str)
seglen = len(words[0])
origwords = list(words)
wordset = set(words)
temlen = len(words) * len(words[0])
ret = []
pos = 0
if length < temlen:
return ret
wordsdict=dict(collections.Counter(origwords))
while pos < length:
subs = str[pos:pos + seglen]
if subs in wordset:
start = pos
while wordsdict.__contains__(subs):
wordsdict[subs]-=1
if wordsdict[subs]==0:
wordsdict.__delitem__(subs)
if len(wordsdict) == 0:
ret.append(pos)
break
start += seglen
subs = str[start:start + seglen]
wordsdict.clear()
wordsdict=dict(collections.Counter(origwords))
pos += 1
return ret
return myfindSubstring(s, words)