文巾解题 784. 字母大小写全排列

1 题目描述

2 解题思路

2.1 递归

设计函数f(s),表示字符串s中所有可能的字母改变大小写后形成的字符串情况组成的列表

那么我们从前向后遍历,对于点i来说f(s)就是点i的情况(分数字or字母)拼接上f(s[1:])的情况

class Solution:
    def letterCasePermutation(self, s: str) -> List[str]:
        def f(S):
            if(len(S)==0):
                return ['']
            else:
                if(S[0]>='0' and S[0]<='9'):
                    ret=[]
                    for i in f(S[1:]):
                        ret.append(S[0]+i)
#如果是数字的话,直接和后面的拼接就好了
                else:
                    ret=[]
                    for i in f(S[1:]):
                        ret.append(S[0]+i)
                        ret.append(S[0].swapcase()+i)
#字母的话,本身和改变了大小写之后的字母,分别和后面的拼接起来。
                return(ret)
        return(f(s))
        

2.2 二分掩码

思路:

假设字符串 S 有 B 个字母,那么全排列就有 2^B个字符串,那么全排列可以用位掩码 bits 唯一地表示。

例如,可以用 00 表示 a7b, 01 表示 a7B, 10 表示 A7b, 11 表示 A7B。只有字母是掩码的一部分,数字不是掩码的一部分。

算法:

根据位掩码,构造正确的全排列结果。如果下一个字符是字母,则根据位掩码添加小写或大写字母。 否则添加对应的数字。

class Solution(object):
    def letterCasePermutation(self, S):

        B = sum(letter.isalpha() for letter in S)
#S中字母有几个(是字母的话isalpha返回1,有几个1就是有几个字母)
        ans = []

        for bits in range(1 << B):
#当前掩码的值

            b = 0
#考虑第几位字母
            word = []
            for letter in S:
                if letter.isalpha():

                    if (bits >> b) & 1:
                        word.append(letter.lower())
#1表示小写字母
                    else:
                        word.append(letter.upper())
#0表示大写字母

                    b += 1
                else:
                    word.append(letter)
#如果是数字,直接append

            ans.append("".join(word))
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值