Re: [閒聊] 每日LeetCode

看板Marginalman作者 (みけねこ的鼻屎)時間1年前 (2022/10/01 15:21), 編輯推噓3(300)
留言3則, 3人參與, 1年前最新討論串19/719 (看更多)
91. Decode Ways 該題提供一個由數字組成的字串s,並提供我們一個編碼表: 'A' -> "1" 'B' -> "2" ... 'Z' -> "26" 求出s共有幾種編碼的方式,若無法被編碼出來返回0。 Example: Input: s = "12" Output: 2 Explanation: "12" could be decoded as "AB" (1 2) or "L" (12). 解法一 遞迴窮舉 思路: 1.每個字串每次都有兩個選擇,分別是一個一個切和兩個兩個切,遞迴樹如下所示: https://i.imgur.com/InBW19F.png
2.當遇到下列情況時,表示當前的字串無法繼續解析: > 字串長度為1且數字 < 1 (0) > 字串長度為2且第一位數 < 1 或 > 2 (06, 38, 46, ...) > 字串長度為2且第二位數 > 6 (27, 28, 29) 3.依據第二點之條件,不斷的把字串切分,當切到最後一個字串時,表示這個切分 是合法的,res遞增 4.返回res Java Code: class Solution { public int numDecodings(String s) { return s.length() == 0 ? 0 : numDecodings(s, 0); } private int numDecodings(String s, int start) { int n = s.length(); if(start == n) return 1; if(s.charAt(start) == '0') return 0; int res = numDecodings(s, start + 1); if(start < n - 1 && (s.charAt(start) == '1' || s.charAt(start) == '2' && s.charAt(start + 1) < '7')) res += numDecodings(s,start + 2); return res; } } 結果:TLE 解法二 記憶體最佳化 1.法一的遞迴過程有太多的重複計算,例如對於字串1111111,我們會重複算多次111, 11 11, 11, ...等等 2.利用一個momo儲存已經算過的區段 Java Code: class Solution { Integer[] memo; public int numDecodings(String s) { memo = new Integer[s.length()]; return s.length() == 0 ? 0 : numDecodings(s, 0); } private int numDecodings(String s, int start) { int n = s.length(); if(start == n) return 1; if(s.charAt(start) == '0') return 0; if(memo[start] != null) return memo[start]; int res = numDecodings(s, start + 1); if(start < n - 1 && (s.charAt(start) == '1' || s.charAt(start) == '2' && s.charAt(start + 1) < '7')) res += numDecodings(s,start + 2); return memo[start] = res; } } 解法三 Button up 1.與法二概念類似,推導出狀態轉移方程後,直接iterative求得解 Java Code: class Solution { public int numDecodings(String s) { if (s.charAt(0) == '0') return 0; char[] chars = s.toCharArray(); int n = chars.length; int[] dp = new int[n + 1]; dp[0] = 1; for (int i = 1; i < dp.length; ++i) { dp[i] = chars[i - 1] == '0' ? 0 : dp[i - 1]; if (i > 1 && (chars[i - 2] == '1' || (chars[i - 2] == '2' && chars[i - 1] < '7'))) { dp[i] += dp[i - 2]; } } return dp[n]; } } 做過的題目 上次是用法三解 這次練習用遞迴解解看 告辭 -- https://i.imgur.com/YPBHGGE.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.165.253.177 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1664608873.A.435.html

10/01 15:22, 1年前 , 1F
你要準備考什麼@@
10/01 15:22, 1F

10/01 15:40, 1年前 , 2F
大師
10/01 15:40, 2F

10/02 00:42, 1年前 , 3F
大師
10/02 00:42, 3F
文章代碼(AID): #1ZD-ffGr (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1ZD-ffGr (Marginalman)