力扣每日一题,784. 字母大小写全排列,python3

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

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

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

 

posted @ 2022-10-31 11:05  wazjr  阅读(79)  评论(0编辑  收藏  举报