820-单词压缩

思路:如果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 };
View Code

猜你喜欢

转载自www.cnblogs.com/nxnslc-blog/p/12590189.html