题目:
本题思想:
在本题中,关键在于小的单词是否是大的单词的后缀子集,对不是后缀的单词长度加一(#号),然后对所有符合条件的单词进行求和;
暴力法思路:
枚举每个单词的所有后缀,然后看是否存在于原单词列表中,如果存在,在原单词列表中进行删除。
解法一(暴力法):(参考官方题解)
代码如下:
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树的构造过程如图所示:
参考自链接:
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
(参考以上)