列表

详情


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

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

比方说,字符串 "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"

 

提示:

 

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string getHappyString(int n, int k) { } };

python3 解法, 执行用时: 44 ms, 内存消耗: 15 MB, 提交时间: 2022-11-26 17:05:27

class Solution:
    def getHappyString(self, n: int, k: int) -> str:
        s = 3 * 2 ** (n - 1)
        if k > s: return ""
        last, res = None, ""
        for i in range(n):
            s = s // (2 if last else 3)
            md = ((k - 1) // s) % (2 if last else 3)
            j = 0
            for c in "abc":
                if c == last: continue 
                if j == md: 
                    res += c
                    last = c
                    break
                j += 1
        return res

golang 解法, 执行用时: 8 ms, 内存消耗: 1.9 MB, 提交时间: 2022-11-26 17:05:06

func getHappyString(n int, k int) string {
    var ans string
    nums:=[]byte{'a','b','c'}
    path:=[]byte{}
    var dfs func(int)
    dfs = func(idx int){
        if len(path)==n{
            if k--;k==0{
                ans = string(path)
                return
            }
        }else if len(path)>n{
            return
        }
        for i:=0;i<len(nums);i++{
            if len(path)==0||path[len(path)-1]!=nums[i]{
                path= append(path,nums[i])
                dfs(idx+1)
                path=path[:len(path)-1]
            }
        }
    }
    dfs(0)
    return ans
}

上一题