题目链接:https://leetcode-cn.com/problems/short-encoding-of-words/
难度:中等
给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A
。
例如,如果这个列表是 ["time", "me", "bell"]
,我们就可以将其表示为 S = "time#bell#"
和 indexes = [0, 2, 5]
。
对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 “#
” 结束,来恢复我们之前的单词列表。
那么成功对给定单词列表进行编码的最小字符串长度是多少呢?
输入: words = [“time”, “me”, “bell”]
输出: 10
说明: S = “time#bell#” , indexes = [0, 2, 5] 。
提示
我自己写了种方法,特别暴力,简言之是先进行排序,按单词的长度降序排序,再逐单词逐字母的比较,功能上能实现,但耗时太久,超出了限制。
下面给出的是参考别人的,思路是一样的
暴力解题:words按单词长度排序,单词长度由长到短遍历,如果目标字符串中可完全读取该单词,舍弃该单词
完全读取:字符串中存在该单词子串,并以“#”结尾
函数
list.sort(cmp=None, key=None, reverse=False)
cmp - 可选参数,使用该参数的方法进行排序
key - 排序依据,只有一个参数
reverse - 排序规则,默认False(升序)
str.find(str1, begin, end)
str1 - 子字符串
begin: end - 查找范围
若str1在str中,返回str1的索引;若不在,返回-1
下面这个是参考别人的
class Solution:
def minimumLengthEncoding(self, words: List[str]) -> int:
words.sort(key = lambda x: len(x)) #按单词长度排序
ans = '' #目标字符串
for i in range(len(words)-1, -1, -1): #按单词长度从长到短遍历(逆序循环)
tmp = ans.find(words[i]) #单词是否在目标字符串中,若存在,返回索引
if tmp == -1: #单词不在目标字符串中,添加进去
ans += words[i] + '#'
else: #单词在目标字符串中,判断能否完全读取
x = ans[tmp:].index('#') #获取单词后第一个“#”索引
if ans[tmp:tmp+x] != words[i]: #判断是否能够完全读取,若不能,添加单词
ans += words[i] + '#'
return len(ans) #返回目标字符串长度
#参考自:
#作者:pumpkin_daytoy
#链接:https://leetcode-cn.com/problems/short-encoding-of-words/solution/python3-bao-li-qiu-jie-by-pumpkin_daytoy/
下面这个是我自己写的(耗时太久,超出了限制)
class Solution:
def minimumLengthEncoding(self, words: List[str]) -> int:
#'''
S = ''
if len(words)==1:
return len(words[0])+1
for k in range(len(words)):
for t in range(len(words))[k:]:
if len(words[k])<len(words[t]):
temp = words[t]
words[t] = words[k]
words[k] = temp
S = words[0] + '#'
indexes = [0]
for word in words[1:]:
i = 0
flag = False
j = 0
while True:
char = word[j]
if char == S[i]:
if j == 0:
flag = True
i += 1
j += 1
else:
if S[i] != word[0]:
i += 1
if flag == True:
j = 0
flag = False
# break
if j == len(word):
if i <= len(S)-1:
indexes.append(i-j)
break
elif j < len(word) and i == len(S)-1:
S = S + word + '#'
break
# if j == len(word) or i == len(S):
# break
return len(S)
#'''