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

Posted 刘文巾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 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

以上是关于文巾解题 784. 字母大小写全排列的主要内容,如果未能解决你的问题,请参考以下文章

784. 字母大小写全排列

leetcode784 字母大小写全排列

python-leetcode784-子集字母大小写全排列

LeetCode 784. Letter Case Permutation (字母大小写全排列 )

文巾解题 567. 字符串的排列

力扣784. 字母大小写全排列 回溯法 C++递归和非递归俩种实现非方式