[LeetCode]784 字母大小写全排列

题目描述

给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。

示例:
输入: S = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]

输入: S = "3z4"
输出: ["3z4", "3Z4"]

输入: S = "12345"
输出: ["12345"]

注意:

  • S 的长度不超过12
  • S 仅由数字和字母组成。

思路

先将所给字符串S的所有字母位扩展为大小写字母。在依次拆开所有双字母元素。

这里写图片描述

实现

class Solution(object):
    def spliteList(self, alist):
        flag = 0    # 判断是否还含有两个字母的元素
        for i in range(len(alist)):
            k = alist[i]
            if len(k) == 2:
                flag = 1
                list1 = alist[:i] + [k[0].lower()] + alist[i+1:]
                list2 = alist[:i] + [k[0].upper()] + alist[i+1:]
                break

        if flag == 0:
            return alist
        else:
            return list1, list2


    def letterCasePermutation(self, S):
        """
        :type S: str
        :rtype: List[str]
        """
        sList = list( S )
        letterNum = 0
        for i in range(len(S)):
            k = sList[i]
            if 'A'<= k <= 'z':
                letterNum += 1  # 统计一下字母的个数
                sList[i] = k.lower() + k.upper()

        allList = []
        allList.append( sList )

        while len( allList ) != 2**letterNum:
            l = len( allList )
            for i in range(l):
                list1 = allList[i]
                if len( list1 ) != len( ''.join(list1)):
                    del allList[i]
                    l1, l2 = self.spliteList( list1 )
                    allList.append( l1 )
                    allList.append( l2 )

        l = len( allList )
        for i in range(l):
            allList[i] = ''.join( allList[i] )

        return allList

end

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值