每日一题--4

1415. 长度为 n 的开心字符串中字典序第 k 小的字符串

难度中等8收藏分享切换为英文关注反馈

一个 「开心字符串」定义为:

  • 仅包含小写字母 ['a', 'b', 'c'].
  • 对所有在 1 到 s.length - 1 之间的 i ,满足 s[i] != s[i + 1] (字符串的下标从 1 开始)。

比方说,字符串 "abc""ac","b" 和 "abcbabcbcb" 都是开心字符串,但是 "aa""baa" 和 "ababbc" 都不是开心字符串。

给你两个整数 n 和 k ,你需要将长度为 n 的所有开心字符串按字典序排序。

请你返回排序后的第 k 个开心字符串,如果长度为 n 的开心字符串少于 k 个,那么请你返回 空字符串 。

 

示例 1:

输入:n = 1, k = 3
输出:"c"
解释:列表 ["a", "b", "c"] 包含了所有长度为 1 的开心字符串。按照字典序排序后第三个字符串为 "c" 。

示例 2:

输入:n = 1, k = 4
输出:""
解释:长度为 1 的开心字符串只有 3 个。

示例 3:

输入:n = 3, k = 9
输出:"cab"
解释:长度为 3 的开心字符串总共有 12 个 ["aba", "abc", "aca", "acb", "bab", "bac", "bca", "bcb", "cab", "cac", "cba", "cbc"] 。第 9 个字符串为 "cab"

示例 4:

输入:n = 2, k = 7
输出:""

示例 5:

输入:n = 10, k = 100
输出:"abacbabacb"

 

做到这题首先想到的是用回溯来做,但是想想这题可以转成树,来确定目标值生成的唯一路径。

根据K来计算树的生成路径,树的叶子数最多为3*pow(2,n-1),已知叶子节点和父节点值不相同,若按照顺序排列,则左叶子的值小于右叶子的值,所以可以得到,所有当k为奇数时,只存在左叶子节点上,当K为偶数时,只存在右叶子节点上,根据这个规律,可以确定唯一一条结果K的生成路径

from math import ceil


class Solution:

    def getHappyString(self, n: int, k: int) -> str:
        max=3*pow(2,n-1)
        if k>max:
            return ""
        step=[]
        result='c'
        t = k
        for i in range(0,n-1):
            if t%2==1:
                step.append(0)
            else:step.append(1)
            t=ceil(t/2)
        a=pow(2,n-1)
        b=2*pow(2,n-1)
        if k>0 and k<=a:
            result='a'
        if k>a and k<=b:
            result='b'
        for i in range(0,len(step)):
            if result[-1]=='a':
                if step[len(step)-1-i]==1:
                    result=result+'c'
                else:result=result+'b'
                continue
            if result[-1]=='b':
                if step[len(step)-1-i]==1:
                    result=result+'c'
                else:result=result+'a'
                continue
            if result[-1]=='c':
                if step[len(step)-1-i]==1:
                    result=result+'b'
                else:result=result+'a'
                continue
        return result
print(Solution.getHappyString(1,10,100))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值