leetcode 三月每日一题:820. 单词的压缩编码

题目:
leetcode 三月每日一题:820. 单词的压缩编码_第1张图片
本题思想:
在本题中,关键在于小的单词是否是大的单词的后缀子集,对不是后缀的单词长度加一(#号),然后对所有符合条件的单词进行求和;

暴力法思路:

枚举每个单词的所有后缀,然后看是否存在于原单词列表中,如果存在,在原单词列表中进行删除。

解法一(暴力法):(参考官方题解)
代码如下:

class Solution:

    def minimumLengthEncoding(self,words):

        good = set(words)

        for word in words:

            for k in range(1, len(word)):

                good.discard(word[k:])

        return sum(len(word) + 1 for word in good)

应用了集合的discard方法,使用discard和remove都可以删除set当中的元素,区别就是remove的元素在set当中没有的话会报错,而discard不会。

二:字典树法:

字典树的理论:

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。
此外 Trie 树也称前缀树(因为某节点的后代存在共同的前缀,比如pan是panda的前缀)。它的核心思想就是通过最大限度地减少无谓的字符串比较,使得查询高效率,即「用空间换时间」,再利用共同前缀来提高查询效率。

Trie树的构造过程如图所示:

leetcode 三月每日一题:820. 单词的压缩编码_第2张图片
leetcode 三月每日一题:820. 单词的压缩编码_第3张图片
参考自链接:
https://juejin.im/post/5c2c096251882579717db3d2

在本题中,我们首先需要创建一个字典树,然后再找出最小字符串的长度。
创建字典树,我们利用python的字典套字典的方案来实现:
代码如下:

        class Node:
            """docstring for ClassName"""
            def __init__(self):

                self.root = {}
                self.end = -1


            def insert(self, word):
                curNode = self.root


                count = 0
                for c in word:

                    if not c in curNode:
                        curNode[c] = {}
                        count += 1
                    curNode = curNode[c]##下一个字符的键值存储在当前字符的value里面,实现嵌套
                curNode[self.end] = True

其中代码中关键的是:
curNode = curNode[c]
即把下一个字符的键值存储在当前字符的value里面,实现嵌套

并且设置添加self.end一对键值,用来判断以当前字符结尾的是不是一个有效的单词
例如存储字符串‘tea’的过程:

>>> trible = {}
>>> cur = trible
>>> cur['t']={}
>>> cur = cur['t']
>>> cur
{}
>>> trible
{'t': {}}
>>> cur['e']={}
>>> cur=cur['e']
>>> cur['a']={}
>>> cur=cur['a']
>>> cur
{}
>>> trible
{'t': {'e': {'a': {}}}}
>>> 

完整代码:

class Solution:


    def minimumLengthEncoding(self,words):


        class Node:
            """docstring for ClassName"""
            def __init__(self):

                self.root = {}
                self.end = -1


            def insert(self, word):
                curNode = self.root


                count = 0
                for c in word:

                    if not c in curNode:
                        curNode[c] = {}
                        count += 1
                    curNode = curNode[c]
                curNode[self.end] = True


            def count_len(self,word):

                curNode = self.root
                for c in word:
                    curNode = curNode[c]
                return len(curNode) == 1

            


        obj = Node()
        cnt = 0
        words = set(words)
        de = 0

        for word in words:

            obj.insert(word[::-1])

        for word in words:

            if obj.count_len(word[::-1]):
                de += len(word) + 1
                # print(de)

        # print(de)
        return de

另外字典树树的其他实现:
https://blog.csdn.net/ANNILingMo/article/details/80879910
(参考以上)

你可能感兴趣的:(leetcode)