Re: [閒聊] 每日leetcode

看板Marginalman作者 (dont)時間1年前 (2024/08/21 15:33), 1年前編輯推噓1(100)
留言1則, 1人參與, 1年前最新討論串746/1548 (看更多)
664. Strange Printer ## 思路 印aaabbaaa的次數 = 印aba的次數 = 印ab的次數 先把連續重複的合起來 aaabbaaa -> aba dp[left][right] = 範圍內最少print的次數 如果s[left] 跟 s[right] 字元一樣, 就回傳 dp[left][right-1] 不然就是在範圍內找k (s[left] == s[k]) 切割成兩個substring ## Complexity Time: O(N^3) Space: O(N^2) ## Code Recursion ```python class Solution: def strangePrinter(self, s: str) -> int: s = [ch for i, ch in enumerate(s) if i == len(s) -1 or ch != s[i+1]] n = len(s) @cache def dp(left, right): if left > right: return 0 if left == right: return 1 if s[left] == s[right]: return dp(left, right-1) res = float('inf') for k in range(left, right): if s[left] == s[k]: res = min(res, dp(left, k) + dp(k+1, right)) return res return dp(0, n-1) ``` Iteration ```python class Solution: def strangePrinter(self, s: str) -> int: s = [ch for i, ch in enumerate(s) if i == len(s) -1 or ch != s[i+1]] n = len(s) dp = [[float('inf')] * n for _ in range(n)] for i in range(n): dp[i][i] = 1 for left in range(n-1, -1, -1): for right in range(left+1, n): if s[left] == s[right]: dp[left][right] = dp[left][right-1] else: for k in range(left, right): if s[left] == s[k]: dp[left][right] = min(dp[left][right], dp[left][k] + dp[k+1][right]) return dp[0][-1] ``` -- http://i.imgur.com/OLvBn3b.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 185.213.82.27 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1724225600.A.E36.html

08/21 15:33, 1年前 , 1F
大師 我已經在看解答了
08/21 15:33, 1F
※ 編輯: dont (185.213.82.27 臺灣), 08/21/2024 15:36:07
文章代碼(AID): #1cnPX0us (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1cnPX0us (Marginalman)