数据结构与算法分析-leetcode笔记

个人微信公众号:AI研习图书馆,欢迎关注~

深度学习知识及资源分享,学习交流,共同进步~

1. 单词的压缩编码

leetcode:820
(1)题目

给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。
例如,如果这个列表是 [“time”, “me”, “bell”],我们就可以将其表示为 S = “time#bell#” 和 indexes = [0, 2, 5]。
对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 “#” 结束,来恢复我们之前的单词列表。
那么成功对给定单词列表进行编码的最小字符串长度是多少呢?

(2)解法

class Solution:
    def minimumLengthEncoding(self, words: List[str]) -> int:
        words = [word[::-1] for word in words]
        words.sort(reverse=True)#按单词大小逆序排序,确保前面的单词"不小于"后者
        ans, curWord = 0, words[0]
        for word in words[1:]:
            if curWord.startswith(word):#如果前缀相同,说明可压缩
                continue
            else:
                ans += len(curWord)+1#加上当前可压缩区间的单词长度
                curWord = word
        ans += len(curWord) + 1 #加上最后一个长度
        return ans

(3)解题思路分析

理解题意之后,两个单词可"合并编码"意味着具有相同后缀,且即使是不连续的单词也可能可以合并编码。

所以直观的想法是:

  1. 为了便于连续比较,首先要将单词按后缀顺序排序 为了便于后缀排序,需首先对所有单词执行一遍倒序
  2. 标记一个当前可合并编码的最长单词cuRword,且curWord可能可合并的区间长度不止2个单词,只要这些单词具有逆序后的公共前缀
  3. 对单词排序时进行逆序,可保证curWord永远"不小于"新单词(包括长度和前缀均不小于)
  4. 对单词列表中所有单词逐一判断:
    – 如果新单词与curWord可以合并,直接进入下一循环
    – 否则,需要更新结果长度,即加curWord+1的长度,同时更新curWord为新单词
  5. 注意最后一个curWord未在循环中加入,所以再补充一下即可
  6. 由于字符串不允许更改,所以逆序和之后切片比较的过程实际上都占用了空间,意味着本方法的空间复杂度会很低O(n*k)

(4)算法注释

a[:-1]与a[::-1]区别

a[:-1]是去掉数组最后一位

例:
a = [1,2,3,4]
print(a[:-1]

在这里插入图片描述

a[::-1]是将数组所有元素逆置

a = [1,2,3,4]
print(a[::-1])

在这里插入图片描述
startswith()

startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。

str.startswith(str, beg=0,end=len(string));

问渠那得清如许,为有源头活水来~

初入LeetCode,算法与数据结构,欢迎点赞、留言~

你可能感兴趣的:(数据结构与算法分析,算法,python)