这几天想开始刷刷题找回点打代码的感觉,太久没打过了!!!
还是得刷题找手感,所以从力扣的每日一题刷起,今天的题目是784. 字母大小写全排列,详细要求如下:
给定一个字符串s,通过将字符串s中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = “a1b2”
输出:[“a1b2”, “a1B2”, “A1b2”, “A1B2”]
示例 2:
输入: s = “3z4”
输出: [“3z4″,”3Z4”]
提示:
1 <= s.length <= 12
s由小写英文字母、大写英文字母和数字组成
由于好久没打过代码了,所以用最简单的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遍历s5 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 ansdef 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 ansdef 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)
码字不易,你们的是激励我继续分享的动力,如果有任何问题,欢迎评论区留言!