题目
A valid encoding of an array of words is any reference string s and array of indices indices such that:
words.length == indices.length- The reference string
sends with the'#'character. - For each index
indices[i], the substring ofsstarting fromindices[i]and up to (but not including) the next'#'character is equal towords[i].
Given an array of words, return the length of the shortest reference string s possible of any valid encoding of words.
Example 1:
Input: words = ["time", "me", "bell"]Output: 10Explanation: A valid encoding would be s = "time#bell#" and indices = [0, 2, 5].words[0] = "time", the substring of s starting from indices[0] = 0 to the next '#' is underlined in "time#bell#"words[1] = "me", the substring of s starting from indices[1] = 2 to the next '#' is underlined in "time#bell#"words[2] = "bell", the substring of s starting from indices[2] = 5 to the next '#' is underlined in "time#bell#"
Example 2:
Input: words = ["t"]Output: 2Explanation: A valid encoding would be s = "t#" and indices = [0].
Constraints:
1 <= words.length <= 20001 <= words[i].length <= 7words[i]consists of only lowercase letters.
题意
将数组中的元素按照指定规则拼成一个最短的字符串。
思路
主要是判断一个字符串是否是另一个字符串的后缀。可以这样处理,先将数组中所有字符串逆置,再按照字典序从大到小排序,这样前缀重合的字符串一定排在一起,且较长的排在前面;遍历数组,如果一个字符串是另一个字符串的前缀,则删去短串,根据最后留下的集合计算答案。
代码实现
Java
class Solution {public int minimumLengthEncoding(String[] words) {List<String> transform = new ArrayList<>();for (String word : words) {transform.add(new StringBuilder(word).reverse().toString());}Collections.sort(transform, Comparator.reverseOrder());int i = 0, j = 1;int count = 0, len = 0;while (j < transform.size()) {if (!transform.get(i).startsWith(transform.get(j))) {count++;len += transform.get(i).length();i = j;}j++;}count++;len += transform.get(i).length();return len + count;}}
