前往
大廳
主題

LeetCode - 1239. Maximum Length of a Concatenated String with Unique Characters 解題心得

Not In My Back Yard | 2022-03-08 00:00:08 | 巴幣 2 | 人氣 219

題目連結:


題目意譯:
你被給定一個字串陣列 arr。一個字串 s 以 arr 的一個有著相異字母的子序列而串接而成。

回傳 s 最大可能的長度。

一個子序列為一陣列其可以由另一個陣列刪除掉若干個或是零個元素並且不更動剩餘元素的相對順序而得到。

限制:
1 ≦ arr.length ≦ 16
1 ≦ arr[i].length ≦ 26
arr[i] 只由小寫英文字母組成。



範例測資:
範例 1:
輸入: arr = ["un","iq","ue"]
輸出: 4
解釋: 所有合法的串接為:
- ""
- "un"
- "iq"
- "ue"
- "uniq"("un" + "iq")
- "ique"("iq" + "ue")
最大長度為 4。

範例 2:
輸入: arr = ["cha","r","act","ers"]
輸出: 6
解釋: 最長合法串接為 "chaers"("cha" + "ers")和 "acters"("act" + "ers")。

範例 3:
輸入: arr = ["abcdefghijklmnopqrstuvwxyz"]
輸出: 26
解釋: 有著全數 26 個字母的那個唯一一個字串。


解題思維:
直接窮舉所有可能的子序列即可。

例如 arr = ["aa", "b", "c"],其長度為 3。即代表我們將有以下 2 ^ 3 種子序列:
空的子序列、
"aa"
"b"
"c"
"aa" + "b"
"aa" + "c"
"b" + "c"
"aa" + "b" + "c"
然後對於每一種子序列我們將其串接在一起,然後判斷是否恰好包含每一種字元恰好一次。最後對於這些符合題目要求的子序列,取其中最長的子序列長度即是所求。



不過由於我們在過程中會重複地判斷同樣的字串包含著什麼樣的字元。因此我們可以在窮舉前就預先處理好,其中我們可以利用一個 32 位元的整數的前 0 ~ 25(含)個位元來代表一個字串擁有哪些字母(也就是當擁有某種字母時,對應的位元將設為 1)。

當如果同一個位元被設為 1 兩次,則代表該字串有著相同的字元。因此在窮舉過程中可以剔除掉這種字串,因為該字串絕對不可能符合題目的要求。

而當我們進行到窮舉過程中,對於每一種子序列我們只需要將每個字串對應的整數 OR 在一起即可。如果有某個位元在多個字串中是 1,則代表該子序列串接起來將會含有相同字元,因此不符合要求。因此我們便可以利用這樣子的機制省下不少判斷的時間。




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

創作回應

更多創作