题目:
Given a list of words, we may encode it by writing a reference string S
and a list of indexes A
.
For example, if the list of words is ["time", "me", "bell"]
, we can write it as S = "time#bell#"
and indexes = [0, 2, 5]
.
Then for each index, we will recover the word by reading from the reference string from that index until we reach a "#" character.
What is the length of the shortest reference string S possible that encodes the given words?
Example:
Input: words =["time", "me", "bell"]
Output: 10 Explanation: S ="time#bell#" and indexes = [0, 2, 5
].
Note:
1 <= words.length <= 2000.
1 <= words[i].length <= 7.
- Each word has only lowercase letters.
思路:
在网上参考了一个非常妙的算法,现在分享如下:
我们将words中的所有字符串都放在一个哈希表中,然后对于哈希表中的每个单词,在哈希表中删除掉它的所有后缀(因为它的后缀可以由它本身encode得到)。最后再计算出来哈希表中所有单词的长度和即可。
代码:
class Solution { public: int minimumLengthEncoding(vector<string>& words) { unordered_set<string> hash(words.begin(), words.end()); for (string w : hash) for (int i = 1; i < w.size(); ++i) // try to erase from the hash set hash.erase(w.substr(i)); int res = 0; for (string w : hash) { res += w.size() + 1; } return res; } };