LeetCode-python 753.破解保险箱

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-python 753.破解保险箱相关的知识,希望对你有一定的参考价值。

参考技术A

题目链接
难度:困难       类型: 深度优先搜索

有一个需要密码才能打开的保险箱。密码是 n 位数, 密码的每一位是 k 位序列 0, 1, ..., k-1 中的一个 。

你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果匹配,则能够打开保险箱。

举个例子,假设密码是 "345",你可以输入 "012345" 来打开它,只是你输入了 6 个字符.

请返回一个能打开保险箱的最短字符串。

示例1

示例2

密码接龙

这道题说的是给了k个数字,值为0到k-1,让我们组成n位密码。我们可以发现,为了尽可能的使钥匙串变短,所以我们的密码之间尽可能要相互重叠,

比如00和01,就共享一个0,
如果是3个数,012和120共享两个数”12”,
那么我们可以发现,两个长度为n的密码最好能共享n-1个数字,这样累加出来的钥匙串肯定是最短的。

密码共有n位,每一个位可以有k个数字,那么总共不同的密码总数就有k的n次方个。我们的思路是先从n位都是0的密码开始,取出钥匙串的最后n个数字,然后将最后一个数字依次换成其他数字,我们用一个Set来记录所有遍历过的密码,这样如果不在集合中,说明是一个新密码,而生成这个新密码也只是多加了一个数字,这样能保证我们的钥匙串最短

本文链接: https://www.jianshu.com/p/6f51c036cb0e

leetcode-python-字母异位词分组

1)先对所有字符串重排序,然后取set获得总共的分组个数。再逐个判断加入。时间复杂度太高了

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        def so(x):
            x= sorted(x)
            return \'\'.join(x)
        temp = list(map(so, strs))
        set_temp = list(set(temp))
        result = list()
        for i in range(len(set_temp)):
            result.append([])    
        for i in range(len(temp)):
            result[set_temp.index(temp[i])].append(strs[i])
        return result

2)哈希表+排序!字典的values也可以是列表!空间复杂度很低

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        dic = dict()

        for i in strs:
            temp = \'\'.join(sorted(i))
            if temp not in dic.keys():
                dic[temp] = [i]
            else:
                dic[temp].append(i)
        return list(dic.values())

 

以上是关于LeetCode-python 753.破解保险箱的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯选拔赛真题53Scratch破解保险柜 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

蓝桥杯选拔赛真题53Scratch破解保险柜 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

蓝桥杯选拔赛真题53Scratch破解保险柜 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

leetcode-python-汉明距离

leetcode-python-缺失数字

leetcode-python-位1的个数