784. Letter Case Permutation

题目

题目即给出一个字符串,然后对数字不做处理,对字母进行排序组合,然后输出排序组合得到的列表。
在这里插入图片描述

纯字母大小写排序组合思路参考:

def strSort(words):
tempword = words
for i in range(2**len(words)):
int_bin = str(bin(i)).replace(“0b”,"")
for i in range(len(words)-len(int_bin)):
int_bin = “”.join((“0”,int_bin))
for index, i in enumerate(int_bin):
if i==‘1’:
wordslst = list(words)
wordslst[index] = wordslst[index].upper()
words = “”.join(wordslst)
yield words
words = tempword

for word in strSort(“def”):
想了挺久感觉题目比较难,仅仅考虑到了大小写排列思路怎么写。写出来结果会过于复杂。
于是查询了讨论区:

优秀代码(极其巧妙)

从前往后,没有使用递归,使用了for,效率略低

import itertools
class Solution(object):
    def letterCasePermutation(self, S):
        """
        :type S: str
        :rtype: List[str]
        """
        res = ['']
        for ch in S:
            if ch.isalpha():
                res = [i+j for i in res for j in [ch.upper(), ch.lower()]]
            else:
                res = [i+ch for i in res]
        return res

从后往前,使用了递归效率更高

class Solution(object):
  def letterCasePermutation(self, S):
      if len(S) == 0:
          return [""]
      temp_result = self.letterCasePermutation(S[1:])
      c = S[0]
      if c.isalpha():
          result = [ u+r for u in [c.upper(), c.lower()] for r in temp_result]
      else:
          result = [ c+r for r in temp_result ]       
      return result

同样是从后往前,思路没有之前的精巧

class Solution(object):
    def letterCasePermutation(self, S):
        return self.permute(S)
    def permute(self, str):
        lenOfStr = len(str)
        if lenOfStr == 0:
            return [""]
        lastElem = str[lenOfStr-1]
        str = str[:lenOfStr-1]
        tempAns = self.permute(str)
        ans = []
        for permutation in tempAns:
            if lastElem.isalpha():
                ans.append(permutation + lastElem.lower())
                ans.append(permutation + lastElem.upper())
            else:
                ans.append(permutation + lastElem)
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值