【力扣-每日小练】820. 单词的压缩编码(python)

820. 单词的压缩编码

题目链接: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] 。

提示

  • 1 <= words.length <= 2000
  • 1 <= words[i].length <= 7
  • 每个单词都是小写字母 。

代码示例

我自己写了种方法,特别暴力,简言之是先进行排序,按单词的长度降序排序,再逐单词逐字母的比较,功能上能实现,但耗时太久,超出了限制。
下面给出的是参考别人的,思路是一样的
暴力解题: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

下面这个是参考别人的

扫描二维码关注公众号,回复: 10249663 查看本文章
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)
        #'''
发布了44 篇原创文章 · 获赞 5 · 访问量 4462

猜你喜欢

转载自blog.csdn.net/ljb0077/article/details/105160171