LeetCode第三十題 Python實現

2021-10-18 19:17:17 字數 2985 閱讀 6434

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...