题目
给定一个单词列表,我们将这个列表编码成一个索引字符串 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