力扣-820.单词的压缩编码-java实现

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

原题链接:
链接: 力扣820单词的压缩编码.

示例:

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

提示:
1 <= words.length <= 20001 <= words[i].length <= 7每个单词都是小写字母 。

解题思路:
输入为一个String类型的字符串数组,要计算最小合并长度。根据题意,先对数组中单词进行长度的降序排序,再对单词进行切割匹配。

java代码实现:

class Solution {
    public int minimumLengthEncoding(String[] words) {
        //用数组实现单词长度降序排序
        Arrays.sort(words, (a, b)->b.length() - a.length());
        //初始化并放入第一个单词
        String result = words[0]+"#";
        //循环遍历单词数组
        for (int i = 1; i < words.length; i++) {
            //indexOf函数用于匹配存在的子串,并返回匹配的位置
            int index = result.indexOf(words[i]);
            //判断后一个单词是否包含在字符串中且是不是单词的后缀
            if (index != -1 && result.substring(index + words[i].length(), index + words[i].length() + 1).equals("#")) {
                continue;
            } else {
                //不是单词后缀,增加新的单词压缩
                result +=  words[i]+"#";
            }
        }
        //最后返回压缩的字符串的长度
        return result.length();
    }
}

声明:
这是作者第一次尝试写博客,如有不对的地方欢迎指正,万分感谢!

版权声明:本文为博主参考后所写文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
参考自:https://blog.csdn.net/mengqingming1/article/details/103728696

你可能感兴趣的:(力扣-820.单词的压缩编码-java实现)