字串DP: 用最少的操作次數生成字串_2 Keys Keyboard_Leetcode #650

閱讀時間約 8 分鐘

題目敘述 Leetcode: 650. 2 Keys Keyboard


一開始初始化的時候,記事本上只有一個字元'A'

只允許下列兩種操作

  1. 複製目前記事本上的整個字串
  2. 貼上之前複製的內容,串接在尾端。


請問,最少需要幾個操作,
才能製造出內容都是 "AAA...A",長度為n,內部每個字元都是'A'的字串?


測試範例

Example 1:

Input: n = 3
Output: 3
Explanation:

一開始,初始字串是A
第一步,複製整個字串A
第二步,貼上A,內容變成AA
第三步,貼上A,內容變成AAA

任務完成,最少需要三步,來生成長度為3,內部每個字元都是'A'的字串"AAA"


Example 2:

Input: n = 1
Output: 0

一開始,初始字串是A
所需步數為零步。​

約束條件

Constraints:

  • 1 <= n <= 1000

n介於1~1000之間。


觀察 試著從小單元複製貼上,精簡步數。


假如n不是質數的時候,
可以試著從更小的小單元(小單元的長度是n的因數)複製貼上,製造出長度為n的字串。


例如: 當n=4時

初始化是A

第一步 複製A

第二步 貼上A,整個字串現在是"AA"

第三步 複製"AA"

第四步 貼上A,整個字串現在是"AAAA"


例如: 當n=6時

初始化是A

第一步,複製A。

第二步,貼上A,整個字串現在是"AA"。

第三步,,貼上A,整個字串現在是"AAA"。

第四步,複製AAA。

第五步,貼上AAA,整個字串現在是"AAAAAA"。


假如n是質數的時候,
代表無法從更小的小單元(小單元的長度是n的因數)複製貼上,製造出長度為n的字串。

只能從A開始一個字元一個字元慢慢貼上。


例如: 當n=3時

初始化是A

第一步,複製A。

第二步,貼上A,整個字串現在是"AA"。

第三步,貼上A,整個字串現在是"AAA"。


例如: 當n=5時

初始化是A

第一步,複製A。

第二步,貼上A,整個字串現在是"AA"。

第三步,貼上A,整個字串現在是"AAA"。

第四步,貼上A,整個字串現在是"AAAA"。

第五步,貼上A,整個字串現在是"AAAAA"。


演算法 字串DP


怎麼定義DP狀態?

定義 DP[ i ] 代表長度為 i 的字串,所需要的最少操作數目。

最後所求就是DP[ n ]


怎麼推導DP狀態轉移關係式?


i 不是質數時,
可以化簡到長度為因數的更小字串,依靠複製貼上,來製造長度為 i的字串。

DP[ i ] = min{ DP[ i // j ] + 1次複製 + (j-1)次貼上, 而且i 是 j 的倍數 }

DP[ i ] = min{ DP[ i // j ] + j, 而且 i 是 j 的倍數 }


最後可以寫成如下的形式( % 代表作除法,取餘數的意思)

DP[ i ] = min{ DP[ i // j ] + j, 而且 i % j == 0 }



i 是質數的時候,

代表無法從更小的小單元(小單元的長度是n的因數)複製貼上,製造出長度為n的字串。

只能從A開始一個字元一個字元慢慢貼上。

DP[ i ] = 1次複製 + (i-1)次貼上 = i 次操作


最後可以寫成如下的形式

DP[ i ] = i


初始條件(終止條件)為何?


最小規模的問題是

i = 1時,剛好是初始化狀態A,不用任何操作,此時DP[ 1 ] = 0

i = 2時,剛好是初始化狀態A,接著複製A一次,再貼上A一次,此時DP[ 2 ] = 2



程式碼 字串DP

class Solution:
def minSteps(self, n: int) -> int:

# helper lambda function to check if x is multiple of y or not
is_divisible = lambda x, y: x % y == 0

table = {}
def dp(i):

if i in table:
return table[i]

if i == 1:

# Base case:
# "A" is given by initial condition, no extra cost.
table[1] = 0
return 0

elif i == 2:

# Base case:
# "AA" is reached by copy "A" and paste "A"
table[2] = 2
return 2

else:
## General cases:

# Usual case, if i is NOT prime number, we can find a shrink factor F of i, which i is divisible by F, allow us to grow from smaller string by copy-and-paste

# the length of smaller string being copied = i / F
# cost of copy: 1
# cost of paste: F - 1

# total cost = DP[ i / F ] + cost of copy + cost of paste = DP[ i / F ] + 1 + F - 1 = DP[ i / F ] + F

# Worst cast, if i is prime number,
# then "AAA...A" with length i can only reached by copy "A" and paste (i-1) times, total cost = 1 + (i-1) = i

table[i] = min( [i] + [dp(i//factor) + factor for factor in range(2, int(i**0.5)+1 ) if is_divisible(i, factor)] )
return table[i]

# ---------------------------------------------------

return dp(n)


複雜度分析

時間複雜度:O(n^1.5)

雙層迭代,外層迭代index i,內層迭代factor,O(n) * O(n^0.5) = O(n^1.5)


空間複雜度: O(n)

需要建立一個DP table,所需空間為O(n)


Reference:

[1] 2 Keys Keyboard - LeetCode

80會員
417內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述: 264. Ugly Number II 定義Ugly number序列是質因數只有2, 3, 5的正整數數列。 也就是說 x = 2^i * 3^j * 5^k, where i >= 0, j >= 0, k >= 0 請計算第n項的Ugly number 等於多少?
給定木板的長度和切割點位置,找到最小總切割成本。透過DP動態規劃和區間DP框架,定義DP狀態並推導出最小切割成本的遞迴關係式。複雜度分析為時間複雜度O(n^3)和空間複雜度O(n^2)。關鍵知識點在於挖掘切割問條的共通模式,透過範例和圖解輔助思考。
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
題目敘述 Triangle 題目會給我們一個三角形的二維陣列triangle ,每個元素分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有兩種選擇: 1.往左下方的格子點移動。 2.往右下方的格子點移動。 測試範例 Examp
Paint House 題目會給定一個成本陣列costs,分別代表每棟房屋粉刷成紅色、藍色、綠色的成本。 請問粉刷所有房屋的最小成本是多少,而且相鄰的房屋不可同一種顏色。
題目敘述 Longest Arithmetic Subsequence of Given Difference 給定一個整數陣列nums,請找出給定公差difference的最長的等差數列的長度是多少?
題目敘述: 264. Ugly Number II 定義Ugly number序列是質因數只有2, 3, 5的正整數數列。 也就是說 x = 2^i * 3^j * 5^k, where i >= 0, j >= 0, k >= 0 請計算第n項的Ugly number 等於多少?
給定木板的長度和切割點位置,找到最小總切割成本。透過DP動態規劃和區間DP框架,定義DP狀態並推導出最小切割成本的遞迴關係式。複雜度分析為時間複雜度O(n^3)和空間複雜度O(n^2)。關鍵知識點在於挖掘切割問條的共通模式,透過範例和圖解輔助思考。
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
題目敘述 Triangle 題目會給我們一個三角形的二維陣列triangle ,每個元素分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有兩種選擇: 1.往左下方的格子點移動。 2.往右下方的格子點移動。 測試範例 Examp
Paint House 題目會給定一個成本陣列costs,分別代表每棟房屋粉刷成紅色、藍色、綠色的成本。 請問粉刷所有房屋的最小成本是多少,而且相鄰的房屋不可同一種顏色。
題目敘述 Longest Arithmetic Subsequence of Given Difference 給定一個整數陣列nums,請找出給定公差difference的最長的等差數列的長度是多少?
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
Thumbnail
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
Thumbnail
題目敘述 Minimum Increment to Make Array Unique 給定一個整數陣列,每回合可以任意挑一個數字進行+1的加法操作。 請問最少需要多少次的+1加法操作,才能讓每個數字都相異?
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
Thumbnail
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
Thumbnail
題目敘述 Minimum Increment to Make Array Unique 給定一個整數陣列,每回合可以任意挑一個數字進行+1的加法操作。 請問最少需要多少次的+1加法操作,才能讓每個數字都相異?
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex