一魚多吃 用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 -

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給定我們一棵二元數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的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
一魚多吃 Linea + 銘文 + Particle Network,今天晚上按頭打 邀請: https://ally.build?inviteCode=AAE6J2 https://ally.build?inviteCode=QOCT15 https://ally.build?inviteC
Thumbnail
這幾年在媒體社群上,著實下了不少功夫,說真的很多人都問說「臉書(Facebook)是不是真的要沒戲唱了?」其實我大多還是抱著比較樂觀的態度,如果你問身邊的年輕人,還用不用FB?那答案恐怕會讓你很心碎,一方面是自己的年紀已經不小,再者可能還會動搖你原本構思好的行銷計畫。 因此很多人在問我FB等等
關於一主多奴,奴寵部份也該注意什麼? 要完全站在奴寵位置思考,還是有點難😅 1.妳能夠在理解之後,打心底接受這樣的關係嗎? 這邊說的接受,不是不停洗腦自己去接受這樣的關係,而是真的能夠接受這樣的關係,理解跟接受是兩回事。 2.妳曾想過想要怎樣的同伴嗎? 因為有時候,可能是妳和她相處的時間
關於一主多奴,無論是主、奴哪方都需要注意的事項。 1.作為主人,你足夠坦誠嗎? 這邊指的坦誠,並不是指等你有了第一個奴一段時間,才突然坦承自己想要多收奴,而是一開始建立關係之前就必須告知讓奴方了解,這是義務,也是作為主人的責任。 在有第一位奴願意理解、接受之後,對後來遇到的第二位甚至往後幾位,
股票可以一魚多吃? 可以,我們熟知的股票,主要是做價差或領股息,但是您知道,還可以做什麼用途嗎? 假如我們不要把股票賣掉,所以不做價差,那麼股票就可以做以下用途。
Thumbnail
說過上餘裕的生活,其實和「財富自由」沒有絕對關係⋯⋯時常覺得夢想和快樂是世上最快被放棄東西,無論是現實勒緊褲袋、或成就地位束縛,是說得頭頭是道卻毫無價值,總是第一個被捨棄⋯⋯
Thumbnail
台北市南港區東明公園相關資訊:: 地址: 台北市南港區南港路二段86巷8弄 (東明社會國宅旁邊) 電話: 02 2585 0192 (管理單位:台北市政府公園路燈工程管理處圓山管理所) 開放時間: 開放空間 (無時間限制) 備註: 公園 東明公園此地佔據在南港區眾多場地精粹之地 ​
Thumbnail
美國農業部將於10/12公佈供需報告,從產量、期末庫存到單產,幾項重要指標皆普遍被預期會較前次調高。 產量:從4374百萬英斗上調至4415百萬英斗(區間4374- 4466百萬英斗) 期末庫存:從1850百萬英斗上調至3000百萬英斗(區間1610- 3730百萬英斗)
Thumbnail
童文薰律師在童溫層節目中整理出蔡英文一魚多吃的記錄 我其實蠻意外,在童文薰律師揭露蔡英文論文原稿一魚多吃之後,御用媒體會真的當回事發報導洗白的;因為這真的不是一般人會關心的事。但《芋傳媒》還真的引用了一個臉書粉專:《翻譯有要緊》的貼文煞有介事的這麼做了。
Thumbnail
蔡英文的國圖版論文公佈之後,除了抄襲爭議外的另一個質疑,就是童文薰律師揭露的一魚多吃。而其中有趣的一則花絮就是...
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
一魚多吃 Linea + 銘文 + Particle Network,今天晚上按頭打 邀請: https://ally.build?inviteCode=AAE6J2 https://ally.build?inviteCode=QOCT15 https://ally.build?inviteC
Thumbnail
這幾年在媒體社群上,著實下了不少功夫,說真的很多人都問說「臉書(Facebook)是不是真的要沒戲唱了?」其實我大多還是抱著比較樂觀的態度,如果你問身邊的年輕人,還用不用FB?那答案恐怕會讓你很心碎,一方面是自己的年紀已經不小,再者可能還會動搖你原本構思好的行銷計畫。 因此很多人在問我FB等等
關於一主多奴,奴寵部份也該注意什麼? 要完全站在奴寵位置思考,還是有點難😅 1.妳能夠在理解之後,打心底接受這樣的關係嗎? 這邊說的接受,不是不停洗腦自己去接受這樣的關係,而是真的能夠接受這樣的關係,理解跟接受是兩回事。 2.妳曾想過想要怎樣的同伴嗎? 因為有時候,可能是妳和她相處的時間
關於一主多奴,無論是主、奴哪方都需要注意的事項。 1.作為主人,你足夠坦誠嗎? 這邊指的坦誠,並不是指等你有了第一個奴一段時間,才突然坦承自己想要多收奴,而是一開始建立關係之前就必須告知讓奴方了解,這是義務,也是作為主人的責任。 在有第一位奴願意理解、接受之後,對後來遇到的第二位甚至往後幾位,
股票可以一魚多吃? 可以,我們熟知的股票,主要是做價差或領股息,但是您知道,還可以做什麼用途嗎? 假如我們不要把股票賣掉,所以不做價差,那麼股票就可以做以下用途。
Thumbnail
說過上餘裕的生活,其實和「財富自由」沒有絕對關係⋯⋯時常覺得夢想和快樂是世上最快被放棄東西,無論是現實勒緊褲袋、或成就地位束縛,是說得頭頭是道卻毫無價值,總是第一個被捨棄⋯⋯
Thumbnail
台北市南港區東明公園相關資訊:: 地址: 台北市南港區南港路二段86巷8弄 (東明社會國宅旁邊) 電話: 02 2585 0192 (管理單位:台北市政府公園路燈工程管理處圓山管理所) 開放時間: 開放空間 (無時間限制) 備註: 公園 東明公園此地佔據在南港區眾多場地精粹之地 ​
Thumbnail
美國農業部將於10/12公佈供需報告,從產量、期末庫存到單產,幾項重要指標皆普遍被預期會較前次調高。 產量:從4374百萬英斗上調至4415百萬英斗(區間4374- 4466百萬英斗) 期末庫存:從1850百萬英斗上調至3000百萬英斗(區間1610- 3730百萬英斗)
Thumbnail
童文薰律師在童溫層節目中整理出蔡英文一魚多吃的記錄 我其實蠻意外,在童文薰律師揭露蔡英文論文原稿一魚多吃之後,御用媒體會真的當回事發報導洗白的;因為這真的不是一般人會關心的事。但《芋傳媒》還真的引用了一個臉書粉專:《翻譯有要緊》的貼文煞有介事的這麼做了。
Thumbnail
蔡英文的國圖版論文公佈之後,除了抄襲爭議外的另一個質疑,就是童文薰律師揭露的一魚多吃。而其中有趣的一則花絮就是...