title: leetcode no.30
categories:
tags:
給定乙個字串 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"]
輸出:
採用最傳統的辦法直接超時了,裂開。
import itertools
class solution(object):
def findsubstring(self, s, words):
""":type s: str
:type words: list[str]
:rtype: list[int]
"""wordlist = list(itertools.permutations(words, len(words))) # 呼叫庫來生成列表排列組合
stringlist =
for i in range(len(wordlist)):
temp = ''
for j in range(len(words)):
temp += wordlist[i][j]
if temp not in stringlist:
indexlist =
for i in range(len(s)):
for j in range(len(stringlist)):
if i + len(stringlist[j]) <= len(s):
if s[i:i + len(stringlist[j])] == stringlist[j]:
return indexlist
if __name__ == '__main__':
s = solution()
print(s.findsubstring(s = "barfoothefoobarman",
words = ["foo","bar"]))
純手擼,乙個小時搞定,頭大。
class solution(object):
def findsubstring(self, s, words):
""":type s: str
:type words: list[str]
:rtype: list[int]
核心思想:
① 先統計words中每個單詞的詞頻、words中單詞的個數和乙個單詞的長度
② 然後從頭開始遍歷s,統計(單詞數×單詞長度)的長度內單詞出現的次數
③ 如果在當前座標下統計到的單詞次數和words中單詞詞頻相同則表示相同並記錄index
"""# 統計words詞頻
wordsnum = len(list(set(words)))
zerolist = [0 for i in range(wordsnum)]
wordsdicts = dict(zip(list(set(words)), zerolist))
for i in words:
wordsdicts[i] += 1
# print(wordsdicts)
# 記錄string詞頻
zerolist = [0 for i in range(wordsnum)]
strdicts = dict(zip(list(set(words)),zerolist))
# 組合後的長度
wordnum = len(words)
wordlength = len(words[0])
sumlength = wordnum * wordlength
# print(strdicts)
# 下標儲存list
indexlist =
# 統計string
for i in range(len(s)):
# 更新詞頻
zerolist = [0 for i in range(wordsnum)]
strdicts = dict(zip(list(set(words)), zerolist))
flag = true
if i + sumlength > len(s):
break
else:
t = i
for j in range(wordnum):
if s[t:t+wordlength] in words:
strdicts[s[t:t+wordlength]] += 1
t += wordlength
else:
flag = false
break
if flag:
flags = true
for k,v in strdicts.items():
if wordsdicts[k] != v:
flags = false
break
if flags:
return indexlist
if __name__ == '__main__':
s = solution()
print(s.findsubstring(s = "barfoothefoobarman",
words = ["foo","bar"]))
Leetcode第三十題 串聯所有單詞的子串
題目 給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。示例 1 輸入 s barfoothefoobarman wo...
《劍指offer》第三十題(包含min函式的棧)
面試題30 包含min函式的棧 題目 定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min 函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 include include include 定義乙個模板類 template class stackwithmin vir...
Android 第三十周
總結 asynctak 封裝了 thread 和 handler,所以可以在子執行緒中執行任務,在主線程中更新 ui 如果應用和主線程沒有互動,則應該使用 thread,而不是 asynctask 1.1 asynctask 的使用限制 1.asynctask 必須在主線程中載入,保證了 handl...