这几天想开始刷刷题找回点打代码的感觉,太久没打过了!!!

还是得刷题找手感,所以从力扣的每日一题刷起,今天的题目是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)

码字不易,你们的是激励我继续分享的动力,如果有任何问题,欢迎评论区留言!