文巾解题 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. 字母大小写全排列的主要内容,如果未能解决你的问题,请参考以下文章