ETH官方钱包

前往
大廳
主題

LeetCode - 0030. Substring with Concatenation of All Words 解題心得

Not In My Back Yard | 2024-04-07 12:00:01 | 巴幣 0 | 人氣 105

題目連結:


題目意譯:
你被給定一字串 s 以及一個字串陣列 words。words 中所有字串的長度都一樣。

s 中一個串接子字串,其為一個包含著 words 中所有字串按照某個順序串接在一起的子字串。

例如說,如果 words = ["ab", "cd", "ef"],則 "abcdef" 、 "abefcd" 、 "cdabef" 、 "cdefab" 、 "efabcd" 和 "efcdab" 全部都是串接字串。而 "acdbef" 則不是,因為它不是 words 中的字串按照某個順序串接起來的。

回傳 s 中所有串接子字串的起始索引值。你可以按任意順序回傳答案。

限制:
1 ≦ s.length ≦ 10 ^ 4
1 ≦ words.length ≦ 5000
1 ≦ words[i].length ≦ 30
s 和 words[i] 由小寫英文字母組成。



範例測資:
範例 1:
輸入: s = "barfoothefoobarman", words = ["foo","bar"]
輸出: [0,9]
解釋: 由於 words.length == 2 且 words[i].length == 3,則串接子字串的長度應為 6。
從索引值 0 開始的子字串為 "barfoo"。其為 ["bar", "foo"] 串接在一起而得,而其為 words 的字串之一個排列。
從索引值 9 開始的子字串為 "foobar"。其為 ["foo", "bar"] 串接在一起而得,而其為 words 的字串之一個排列。
輸出順序不重要?;貍?[9,0] 也是可行的。

範例 2:
輸入: s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
輸出: []
解釋: 由於 words.length == 4 且 words[i].length == 4,則串接子字串的長度應為 16。
s 中沒有長度 16 的子字串其為 words 中字串按某個順序串接在一起所組成。
我們回傳一個空陣列。

範例 3:
輸入: s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
輸出: [6,9,12]
解釋: 由於 words.length == 3 且 words[i].length == 3,則串接子字串的長度應為 9。
從索引值 6 開始的子字串為 "foobarthe"。其為 ["foo","bar","the" 串接在一起而得,而其為 words 的字串之一個排列。
從索引值 9 開始的子字串為 "barthefoo"。其為 ["bar","the","foo"] 串接在一起而得,而其為 words 的字串之一個排列。
從索引值 12 開始的子字串為 "thefoobar"。其為 ["the","foo","bar"] 串接在一起而得,而其為 words 的字串之一個排列。


解題思維:
(假設 words 中字串的長度為 L,且 words 的長度為 N)
滑動視窗(Sliding Window,參見這題)的變化題。現在每個視窗每次不只移動 1 個字母而是 L 個。例如說,在範例 1 中(注:下列的例子中是以藍色表示當前視窗。所以如果藍色不見了,請通知我)
"barfoofoobarthefoobarman"
變成
"barfoofoobarthefoobarman"
再移動可得
"barfoofoobarthefoobarman"
以此類推可依序得到
"barfoofoobarthefoobarman"、
"barfoofoobarthefoobarman"、
"barfoofoobarthefoobarman"、
"barfoofoobarthefoobarman"

而可以看到上例中,我們只有包含到從索引值 0 開始的視窗。而我們還需要從索引值 1 開始、從索引值 2 開始、………、從索引值 L - 1 開始。這樣便可以得到所有可能的、長度為 NL 的視窗。

而我們只要維護視窗中有哪些字串(每 L 個字母為一個字串,這邊可以用雜湊表(Hash Table)來統計)以及有多少在 words 中。如果有某個視窗中的字串剛好包含 words 中所有字串,則這個視窗的開頭索引值即是題目想要的索引值之一。把這些符合條件的視窗之索引值丟進一個陣列中回傳即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作