LeetCode面试算法-力扣 820. 单词的压缩编码

题目描述

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


示例 1:

    输入: words = ["time", "me", "bell"]
    输出: 10
    说明: S = "time#bell#" , indexes = [0, 2, 5] 。


分析:根据题意,移除words中作为其他单词后缀的单词,然后将剩余的单词添加#组合,求组合后字符串的长度。将words数组通过Arrays.asList()转换为列表,新建一个Set用于去重,遍历words数组中的单词,通过str.substring(start, end)将set集合中后缀单词移除,其中str.substring(i)等价于str.substring(i, str.length()) 即 [i,str.length()),最后遍历剩余set集合,累加单词长度加#长度。


class Solution {
    public int minimumLengthEncoding(String[] words) {
        if (words == null || words.length == 0)
            return 0;
        Set set = new HashSet<>(Arrays.asList(words));
        for (String str : words) {
            for (int i = 1; i < str.length(); i++) {
                set.remove(str.substring(i));
            }
        }
        int sum = 0;
        for (String str : set) {
            sum += str.length() + 1;
        }
        return sum;
    }
}

 

你可能感兴趣的:(科目一考试,JavaStudy,LeetCode-面试-算法)