Leetcode-784. Letter Case Permutation 字母大小写全排列

题目

给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
链接:https://leetcode.com/problems/letter-case-permutation/

Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create.

Example:

Input: S = “a1b2”
Output: [“a1b2”, “a1B2”, “A1b2”, “A1B2”]

思路及代码

1. 位运算初尝试
  • str.isalpha(): 判断字符串是否只由字母组成
# 160ms 6.11%
class Solution:
    def letterCasePermutation(self, S: str) -> List[str]:
        cur = []
        ans = []
        
        def convert(letter):
            if letter.upper() == letter:
                return letter.lower()
            else:
                return letter.upper()
        
        for bit in range(1<<len(S)):   
            for i in range(len(S)):
                if not S[i].isalpha(): # number
                    if not bit & 1<<i:
                        break
                    cur.append(S[i])
                else:
                    if bit & 1<<i:
                        cur.append(convert(S[i]))
                    else:
                        cur.append(S[i])
            if len(cur) == len(S):
                ans.append("".join(cur))
            cur = []
            
        return ans   
2. 改进
  • DFS recursion
  • 如果是字母,两个分支;如果是数字,一个分支
# 64ms 35.99%
class Solution:
    def letterCasePermutation(self, S: str) -> List[str]:
        ans = []
        S = list(S)
        
        def convert(letter):
            if letter.upper() == letter:
                return letter.lower()
            else:
                return letter.upper()
        
        def dfs(S, i, ans):
            if i == len(S):
                ans.append("".join(S))
                return
            dfs(S, i+1, ans)
            if S[i].isalpha():
                S[i] = convert(S[i])
                dfs(S, i+1, ans)
                S[i] = convert(S[i])
                
        dfs(S, 0, ans)
        return ans
3. 进阶
  • ^异或 1<<5,相当于把第5位从0变到1,从1变到0, 即实现大小写的转换
    • 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0
  • ord()返回对应的ASCII码
  • chr()返回对应的ASCII字符
# 大小写互相转换
S[i] = chr(ord(S[i]) ^ (1<<5))
4. 笛卡尔积
  • 来源于Discuss区(/膜)
class Solution:
    def letterCasePermutation(self, S: str) -> List[str]:
        L = [[l.upper(), l.lower()] if l.isalpha() else l for l in S]
        return ["".join(s) for s in itertools.product(*L)]

复杂度

DFS:
T = O ( n ∗ 2 l ) O(n*2^l) O(n2l),l为字母的个数
S = O ( n ) O(n) O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值