30 串聯所有單詞的子串 (字典)

2021-09-26 07:04:05 字數 2017 閱讀 4927

給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。

注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。

示例 1:

輸入:

s = "barfoothefoobarman",

words = ["foo","bar"]

輸出:[0,9]

解釋:從索引 0 和 9 開始的子串分別是 "barfoor" 和 "foobar" 。

輸出的順序不重要, [9,0] 也是有效答案。

示例 2:

輸入:

s = "wordgoodgoodgoodbestword",

words = ["word","good","best","word"]

輸出:

【困難】

【分析】注意,words中的單詞都是長度相同的單詞。

設n是words中的所有單詞串聯而成的字串的長度。

判斷子字串s0是否是由words中的單詞串聯而成:

注1:python中建立詞到詞頻的雜湊表(見code)

dic={}

dic['key']=dic.get('key',0)

注2:python中將字典預設初始化為列表:

from collections import defaultdict

dic=defaultdict(list)

lst = [('aaa', 5), ('a', 2), ('a', 4), ('b', 4), ('aaa', 1)]

for i,j in s:

print(list(dic.items()))

下面是判斷字串是不是由words中的單詞串聯的函式:

#判斷字串是不是由words中的單詞串聯的函式:

## 將s0切割成乙個乙個單詞

lst=

for k in range(0,n,n0):

##判斷lst中的單詞是不是由words串聯起來的:

##將此判斷轉化為詞頻來判斷。

res={}

for word in lst:

return false

else:

res[word]=res.get(word,0)+1

return false

對def issubstring作一點改進:

class solution(object):

def findsubstring(self, s, words):

""":type s: str

:type words: list[str]

:rtype: list[int]

"""if len(s)==0:

return

if len(words)==0:

return

##建立詞頻字典

for word in words:

n0=len(words[0]) #單詞的長度

n=len(words)*n0 #子字串的長度

res=

i=0while i<=len(s)-n:

#s[i:i+n]是等於總單詞長度的s字串

i+=1

return res

#判斷字串是不是由words中的單詞串聯的

## 一邊將s0切割成乙個乙個單詞的同時判斷其詞頻

res={}

for k in range(0,n,n0):

word=s0[k:k+n0]

return false

else:

res[word]=res.get(word,0)+1

return false

30 串聯所有單詞的子串

本文參考 一開始的思路是使用遞迴做出words所有結合情況的字典 然後在s中擷取words長度去查字典 結果超時了 超時 class solution for int i 0 i chang i return vectorfindsubstring string s,vector words vec...

30 串聯所有單詞的子串

給定乙個字串 s 和一些長度相同的單詞words。找出s中恰好可以由words中所有單詞串聯形成的子串的起始位置。注意子串要與words中的單詞完全匹配,中間不能有其他字元,但不需要考慮words中單詞串聯的順序。輸入 s barfoothefoobarman words foo bar 輸出 0,...

30 串聯所有單詞的子串

給定乙個字串s和一些長度相同的單詞words。找出s中恰好可以由words中所有單詞串聯形成的子串的起始位置。注意子串要與words中的單詞完全匹配,中間不能有其他字元,但不需要考慮words中單詞串聯的順序。示例 1 輸入 s barfoothefoobarman words foo bar 輸出...