【力扣刷题day1】开心字符串 难度:中等

题目

题目

思路

利用树状结构和分组思想,字符串首位可分三组、后面每一位可分两组,根据k确定第k个字符串所在组数及对应字母。即三颗满二叉树,根节点分别为a、b、c ,一共3*2^(n-1)个叶子节点,寻找第k个叶子节点。

代码

class Solution(object):
    def getHappyString(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: str
        """
        resStr = "" #存放结果字符串

        if(k>3*2**(n-1)):return "" #长度为n时,一共有3*2**(n-1)个开心字符串

        abclst = ["a", "b", "c"]

        # 从第一个位置往后找
        group_num = 3 #三大组,分别以a、b、c开头
        groupmem_num = 2 ** (n - 1) #每一大组共2**(n - 1)个字符串
        judgelst = []  # 判断k在第几组
        groupfirst = 1
        chooselst = [['b','c'], ['a', 'c'], ['a', 'b']] #当前位置为abc时分别可以对应的后续字符

        while (len(resStr) != n): #当结果字符串长度不为n时
            if (len(resStr) > 0): #已确定开头
                group_num = 2 #当前字符后的小组数
                groupmem_num = 2 ** (n - 1 - len(resStr)) #以当前resStr开头的开心字符串总个数
            for i in range(0, group_num):
                judgelst.append(i * groupmem_num + groupfirst) #[1, 1*groupmem_num+1, ...] #当前分组,用来判断k在第几组

            for i in range(0, group_num):
                if (i < group_num - 1):
                    if (k >= judgelst[i] and k < judgelst[i + 1]): #k在第i组范围中
                        groupfirst = judgelst[i] #记录组首号
                        if (len(resStr) != 0):
                            resStr += chooselst[abclst.index(resStr[len(resStr)-1])][i] 
                        else:
                            resStr += abclst[i]
                        break
                else:
                    if (k >= judgelst[i]):
                        groupfirst = judgelst[i]
                        if (len(resStr) != 0):
                            resStr += chooselst[abclst.index(resStr[len(resStr) - 1])][i]
                        else:
                            resStr += abclst[i]
                        break
            judgelst = []

        return resStr


运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值