給定乙個字串 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 輸出...