思路:如果X是Y的后缀,那么X就可以删掉,生成的字符长度最短就不需要Y,由数据范围可知一个单词最多含有 7 个后缀,所以我们可以枚举单词所有的后缀。对于每个后缀,如果其存在 words 列表中,我们就将其从列表中删除。为了高效删除,我们将 words 用哈希集合(HashSet)来存储。
个人刚开始设计的思路:用map存储<单词,单词长度>然后将map按照单词长度值从大到小排序。然后用双指针进行二重双循环,找到有后缀相同的删掉(复杂度较大),单词长的排前面主要是因为肯定会包括后面短的单词。最后统计长度在进行相加。和官方给的思路相比还是有点差距的。
明天开始整理面试内容和C++新特性用法,这几天敲代码发现用新特性速度都快了不少,所以明天开始恢复更新速度了哦。
1 class Solution { 2 public: 3 int minimumLengthEncoding(vector<string>& words) { 4 unordered_set<string> good(words.begin(), words.end()); 5 for (const string& word: words) { 6 for (int k = 1; k < word.size(); ++k) { 7 good.erase(word.substr(k)); 8 } 9 } 10 11 int ans = 0; 12 for (const string& word: good) { 13 ans += word.size() + 1; 14 } 15 return ans; 16 } 17 };