单词的压缩编码
难度:
标签:
题目描述
代码结果
运行时间: 45 ms, 内存: 16.4 MB
/*
* 思路:
* 1. 创建一个Set来存储words数组中所有单词的所有后缀。
* 2. 使用Stream API遍历每个单词的所有后缀并添加到Set中。
* 3. 使用Stream API遍历words数组,检查每个单词是否在Set中(即它不是另一个单词的后缀),如果是,则将它的长度加1(因为需要加上'#')。
* 4. 返回所需长度。
*/
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int minimumLengthEncoding(String[] words) {
Set<String> suffixes = new HashSet<>();
Arrays.stream(words).forEach(word -> {
for (int i = 0; i < word.length(); i++) {
suffixes.add(word.substring(i));
}
});
return Arrays.stream(words)
.filter(suffixes::contains)
.peek(suffixes::remove) // 防止重复计数
.mapToInt(word -> word.length() + 1)
.sum();
}
}
解释
方法:
这个题解的思路是利用字符串排序和后缀匹配来解决问题。首先将所有单词按照反转后的字典序排序,这样可以保证如果一个单词是另一个单词的后缀,那么它一定会出现在那个单词的后面。然后遍历排序后的单词列表,如果当前单词不是下一个单词的后缀,说明当前单词需要被编码,将其长度加1(表示单词结尾的'#')累加到结果中。最后将最后一个单词的长度加1也累加到结果中,因为最后一个单词一定需要被编码。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在解题中选择将单词进行反转后再排序,这种排序方式对解题有什么帮助?
▷🦆
当判断一个单词是否为另一个单词的后缀时,为什么只检查当前单词与下一个单词而不是所有其他单词?
▷🦆
如果有多个单词相同,这种方法处理时会有什么特殊考虑吗?
▷🦆
解题思路中提到的`如果当前单词不是下一个单词的后缀`,能否给出一个具体的例子说明这种情况?
▷