這幾天想開始刷刷題找回點打代碼的感覺,太久沒打過了!!!
還是得刷題找手感,所以從力扣的每日一題刷起,今天的題目是784. 字母大小寫全排列,詳細要求如下:
給定一個字串 s ,通過將字串 s 中的每個字母轉變大小寫,我們可以獲得一個新的字串,
回傳 所有可能得到的字串集合 ,以 任意順序 回傳輸出,
示例 1:
輸入:s = "a1b2"
輸出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
輸入: s = "3z4"
輸出: ["3z4","3Z4"]
提示:
1 <= s.length <= 12
s 由小寫英文字母、大寫英文字母和數字組成
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/letter-case-permutation
由于好久沒打過代碼了,所以用最簡單的python吧
分析如下:
第一回合(錯誤):
看到題目的第一眼,我就想著能不能一次遍歷就搞定呢
1 class Solution: 2 def letterCasePermutation(self, s: str) -> List[str]: 3 ans = []#定義結果陣列 4 for i in range(len(s)):#從0到len(s)- 1遍歷s 5 if s[i].isalpha():#判斷是否為字母 6 ans.append(s[:i] + s[i].upper() + s[ i + 1:])#結果陣列直接添加s[i]轉為大寫的新字串 7 ans.append(s[:i] + s[i].lower() + s[ i + 1:])#結果陣列直接添加s[i]轉為小寫的新字串
return ans
結果當然是錯誤了
第二回合(蹩腳遞回):
想了挺久的,知道可能要用遞回來處理,但是忘記怎么寫了,試著寫了一下,代碼如下:
class Solution: def letterCasePermutation(self, s: str) -> List[str]: ans = [] if len(s) == 1 and s.isalpha():#當s為單個字母時 ans.append(s.upper()) ans.append(s.lower()) return ans else: df(self, s, 0, ans)#深度遍歷 return ans def df(self, s, i, ans): if i == len(s) - 1:#如果腎竇遍歷到最后一個字符時!!!注意這個遞回出口!!! ans.append(s) return if s[i].isalpha():#如果是字母 s = s[:i] + s[i].upper() + s[ i + 1:] df(self, s, i + 1, ans) s = s[:i] + s[i].lower() + s[ i + 1:] df(self, s, i + 1, ans) else:#如果是數字 df(self, s, i + 1, ans)
我是因為遇到輸入單字母時出錯才改成這樣的,結果提交了還是錯了,因為我沒有考慮到輸入長字串時的最后一個字符是字母的情況!!!
看著上面那一坨我就不想再打補丁了,沒心情再改了,這時候我終于發現為什么我的深搜函式不可以處理最后一個字符呢?原來就是因為遞回出口提前了,沒有處理到最后一個字符,一切都輕松了,直接把多余的判斷條件去掉就行,
第三回合(成功):
代碼如下:
class Solution: def letterCasePermutation(self, s: str) -> List[str]: ans = [] df(self, s, 0, ans) return ans def df(self, s, i, ans): if i == len(s):#修改后的遞回出口 ans.append(s) return if s[i].isalpha(): s = s[:i] + s[i].upper() + s[ i + 1:] df(self, s, i + 1, ans)#大寫字母遞回 s = s[:i] + s[i].lower() + s[ i + 1:] df(self, s, i + 1, ans)#小寫字母遞回 else:#數字直接下一步 df(self, s, i + 1, ans)
碼字不易,你們的
是激勵我繼續分享的動力,如果有任何問題,歡迎評論區留言!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/523918.html
標籤:其他
上一篇:必知必會開發工具集合
