LeetCode820.单词的压缩编码

题目描述:

给定一个单词列表,我们将这个列表编码成一个索引字符串 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.1 <= words.length <= 2000
2.1 <= words[i].length <= 7
3.每个单词都是小写字母 。


解题思路1:
1.不得不说力扣的判题机制太强了,用例过了29个,还差最后一个的时候给我来了二百个字符串,真的是吃屎的冲动都有了,于是我想把最后一个用力自己手动写上去,结果还是不行,原来前边也有超过200的用例,真的是枯了
2.那么来说一下我的思路吧,题目 说的是仅用字符串和下标可以表示所有的单词,但必须以井号结尾,这就排除了有的单词可以在其中间的情况,只能是单词的后缀,因为有次序的原因,me,time和time和me两种情况,于是我便用枚举把每个单词都在原数组中查看一遍,如果是其中的后缀便pass,但是漏洞就是如果数组的单词都一样便都会被过滤掉,所以我只能看了官方的题解,如果大佬们有 什么好的方法可以教教我。
解题思路2:
1.官方题解用了字典树的知识
字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
2.如果单词 X 是 Y 的后缀,那么单词 X 就不需要考虑了,因为编码 Y 的时候就同时将 X 编码了。例如,如果 words 中同时有 “me” 和 “time”,我们就可以在不改变答案的情况下不考虑 “me”。
3.如果单词 Y 不在任何别的单词 X 的后缀中出现,那么 Y 一定是编码字符串的一部分。

因此,目标就是保留所有不是其他单词后缀的单词,最后的结果就是这些单词长度加一的总和,因为每个单词编码后后面还需要跟一个 # 符号。
4.于是便用set过滤掉相同字符串,然后在set中把每个单词的后缀删除,不得不说这种方法很牛掰
解题代码:

public class Solution {
	public int minimumLengthEncoding(String[] words) {
        Set<String>arr=new HashSet<>();
        int sum=0;
        for(int i=0;i<words.length;i++) {
        	arr.add(words[i]);
        }
        for(String str:arr) {
        	for(int k=1;k<str.length();k++) {
        		arr.remove(str.substring(k));
        	}
        }
        for(String str:arr) {
        	sum+=str.length()+1;
        }
        return sum;
	}
}
发布了69 篇原创文章 · 获赞 34 · 访问量 8613

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/105168471