一魚多吃 用DFS來解英文字母覆蓋問題_Leetcode #1239

更新於 發佈於 閱讀時間約 7 分鐘

題目敘述

題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元陣列子序列將字串進行串接,成為字串s,請問字串s的最大長度是多少?

例如:

arr=["dog","cow","cat"]

我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的最長長度為6

註:

"dog","cow"不能同時選進來,因為dog和cow有重複的字元o,這是題目的限制。

"cow","cat"也不能同時選進來,因為cow和cat有重複的字元c,這是題目的限制。


題目的原文敘述


測試範例

Example 1:

Input: arr = ["un","iq","ue"]
Output: 4
Explanation: All the valid concatenations are:
- ""
- "un"
- "iq"
- "ue"
- "uniq" ("un" + "iq")
- "ique" ("iq" + "ue")
Maximum length is 4.

Example 2:

Input: arr = ["cha","r","act","ers"]
Output: 6
Explanation: Possible longest valid concatenations are "chaers" ("cha" + "ers") and "acters" ("act" + "ers").

Example 3:

Input: arr = ["abcdefghijklmnopqrstuvwxyz"]
Output: 26
Explanation: The only string in arr has all 26 characters.

約束條件

Constraints:

  • 1 <= arr.length <= 16

輸入陣列arr的長度介於1 ~ 16 之間。

  • 1 <= arr[i].length <= 26

每個字串的長度介於 1~26 之間。

  • arr[i] contains only lowercase English letters.

陣列元素皆為字串,裡面只會有小寫英文字母。


演算法

其實單獨對於每個字串arr[i]來說只有兩種可能情況

一種是被選進來,當作字串串接的對象。(前提是和已經選擇的字串彼此之間沒有重複的字元)

另一種是沒有被選進來,直接跳過。


我們可以用DFS+回溯法,遞迴展開每種可能的情況,並且在遞迴結束的地方更新字串串接的最大長度

最後,回傳所有可能情況之下的串接字串最大長度,就是答案。


程式碼

class Solution:
def maxLength(self, arr: List[str]) -> int:

# Best length of character set, initialized as 0
self.max_length = 0

## parameter
# i: index of string array, arr
# cur_set: current character set so far
def dfs(i, cur_set):

## Base case aka stop condition
if i == len(arr):

# We've checking all possible combination
# Update max length of current character set
self.max_length = max(self.max_length, len(cur_set) )
return


## General case:
# Either we choose set_i, or skip set_i
set_i = set(arr[i])

# Option_#1: Select current set_i
if len( cur_set & set_i ) == 0 and ( len(set_i) == len(arr[i]) ):
dfs(i+1, cur_set | set_i )

# Option_#2: Skip current set_i
dfs(i+1, cur_set)
return
# ===========================================

dfs(i=0, cur_set=set() )
return self.max_length

複雜度分析

時間複雜度:

對於每條字串,遞迴展開所有可能情況,所需時間為O(2^n)。

每條字串有兩種可能: 1.選進來 或者 2.被略過。

空間複雜度:

遞迴深度最大為n,從第一條字串,遞迴展開到最後一條。所需stack深度為O(n)


關鍵知識點

當使用枚舉類的演算法去展開所有可能情況時,聯想到最常用的演算法框架:

DFS 深度優先搜索+ Backtracking 回溯法,必要的時候可以再額外使用pruning剪枝來排除不可能產生最優解的情況。


Reference:

[1] Maximum Length of a Concatenated String with Unique Characters -

avatar-img
92會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
你可能也想看
Google News 追蹤
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
嗨~大家好,我是喵喵貓我自己主要是在Dcard上發珍食分享,之後想將吃過的美食、餐廳、特殊食物等都來發到這個小天地,也希望有更多人可以來留言認識認識!
Thumbnail
[飯]吃飽了然後呢? 想太少會像一隻豬 想太多又會像一隻充滿煩惱的豬 怎麼辦……….
Thumbnail
不少自學雅思的考生聽從網路上找到的建言,把IELTS Speaking Part 2分門別被,讓相同類別,譬如說:人、地、時、事、物,的考題可以共用相同回答。這樣很好,可以練習臨場反應與活用能力。但是,光是限制在同一種類型的考題可以共用回答,這是畫地自限的做法。 終極的活學活用,可以讓不同類型的考
Thumbnail
放了很多圖片的解答(一直複製貼上好累ㄚ)
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
A dog a cat a lamb a cage a zoo.這是諷刺人類動物園機制的小詩。A hen a hare a cage their feet our math.這是雞兔同籠的英文冷笑話。
Thumbnail
題目敘述 給定兩個字串word1和word2,每次操作時,可以有三個選項 插入一個字元 刪除一個字元 替換一個字元 請問把word1轉換成word2的最小操作次數是多少? 題目的原文敘述 約束條件 Constraints: 0 <= word1.length, word2.le
Thumbnail
題目敘述 題目會給我們兩種無限量供應的骨牌Domino 和 Tromino,形狀分別如下 題目的輸入會有一個參數n。 可以任意旋轉方向進行拼接,請問最後拼成 2 x n 長方形區域的方法數有幾種? 例如 n = 3 時,拼成2 x 3 的長方形區域有五種方法。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
嗨~大家好,我是喵喵貓我自己主要是在Dcard上發珍食分享,之後想將吃過的美食、餐廳、特殊食物等都來發到這個小天地,也希望有更多人可以來留言認識認識!
Thumbnail
[飯]吃飽了然後呢? 想太少會像一隻豬 想太多又會像一隻充滿煩惱的豬 怎麼辦……….
Thumbnail
不少自學雅思的考生聽從網路上找到的建言,把IELTS Speaking Part 2分門別被,讓相同類別,譬如說:人、地、時、事、物,的考題可以共用相同回答。這樣很好,可以練習臨場反應與活用能力。但是,光是限制在同一種類型的考題可以共用回答,這是畫地自限的做法。 終極的活學活用,可以讓不同類型的考
Thumbnail
放了很多圖片的解答(一直複製貼上好累ㄚ)
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
A dog a cat a lamb a cage a zoo.這是諷刺人類動物園機制的小詩。A hen a hare a cage their feet our math.這是雞兔同籠的英文冷笑話。
Thumbnail
題目敘述 給定兩個字串word1和word2,每次操作時,可以有三個選項 插入一個字元 刪除一個字元 替換一個字元 請問把word1轉換成word2的最小操作次數是多少? 題目的原文敘述 約束條件 Constraints: 0 <= word1.length, word2.le
Thumbnail
題目敘述 題目會給我們兩種無限量供應的骨牌Domino 和 Tromino,形狀分別如下 題目的輸入會有一個參數n。 可以任意旋轉方向進行拼接,請問最後拼成 2 x n 長方形區域的方法數有幾種? 例如 n = 3 時,拼成2 x 3 的長方形區域有五種方法。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E