码迷,mamicode.com
首页 > 编程语言 > 详细

Leetcode1415-长度为 n 的开心字符串中字典序第 k 小的字符串(Python3实现)

时间:2020-04-21 22:30:05      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:实现   字符串   大于   get   下标   描述   整数   结果   两种   

题目描述:

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

  • 仅包含小写字母 [‘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 个,那么请你返回空字符串 。

示例 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"。

示例 5:

输入:n = 10, k = 100
输出:"abacbabacb"
解题思路:
1、先根据n值建立第一种情况(‘ababa...‘,长度为n)。
2、根据k值,进行k-1次循环,直至得到第k次的结果。
3、每次循环中,针对最后两位的情况分六种情况讨论:
1)针对([a,b],[b,a],[c,a])三种情况,直接对最后一位进行更新,即b->c,a->c,a->b。
2)同时针对其中的三种情况([a,c],[b,c],[c,b]),利用递归进行倒数第二位的更新,同时根据倒数第二位的结果更新最后一位。

代码:

 

class Solution:
    def getHappyString(self, n: int, k: int) -> str:
        def add(array):
            #因为k值大小必定是小于等于所有情况数的
            #所以,当array长度为1时,此时array值必定只能为‘a‘或‘b‘,只要进行直接更新即可
            if len(array)==1:
                if array[-1]==a:
                    return [b]
                else:
                    return [c]
            #当array长度大于1时,就分情况进行讨论
            ##第1,2种情况:[a,b],[b,a],直接更新最后一位为‘c‘即可
            if (array[-2]==a and array[-1]==b) or (array[-2]==b and array[-1]==a):
                array[-1]=c
                return array
            #第3种情况:[c,a],直接更新最后一位为‘b‘即可
            elif array[-2]==c and array[-1]==a:
                array[-1]=b
                return array
            #第4,5,6种情况:[a,c],[b,c],[c,b],其中[a,c]情况得到的最后一位必定是‘a‘,后两种的最后一位更新情况需要根据倒数第二位决定
            else:
                tmp=add(array[:-1])
                return tmp + [b] if  tmp[-1]==a else tmp + [a]
        
        #字符串每增加一位长度,情况*2
        allCases=3*(2**(n-1))
        #判定n,k是否符合条件
        if allCases<k or n<1 or k<0:
           return ""
        #生成第一种情况的字符串
        arr=[a]
        for i in range(1,n):
            arr.append(a) if arr[-1]!=a else arr.append(b)
        #循环k-1次得到第k次的结果
        for i in range(1,k):
            arr=add(arr)
        return ‘‘.join(arr)

 LeetCode判定结果:

技术图片

Leetcode1415-长度为 n 的开心字符串中字典序第 k 小的字符串(Python3实现)

标签:实现   字符串   大于   get   下标   描述   整数   结果   两种   

原文地址:https://www.cnblogs.com/lhdb/p/12748395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!