leetcode单词的压缩编码

1.反转+排序

当一个字符串是另一个字符串的后缀时,该字符串可以省略,如me是time的后缀

首先遍历字符串数组,反转每一个字符串,

然后将字符串数组按照字典需排列

如time me bell 

反转emit em lleb

按字典序排列 em emit lleb

只需要比较相邻的字符串是否后一个包含前一个即可

如em 是emit的前缀,则跳过em

代码如下:

class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        //将words中每个字符串都反转,然后做前缀匹配
        for(int i=0;i<words.size();i++)
           reverse(words[i].begin(),words[i].end());
        sort(words.begin(),words.end());
        int res=0;
        for(int i=0;i<words.size()-1;i++)
        {
            int size=words[i].size();
            if(words[i]==words[i+1].substr(0,size))//当前字符串为后一个的前缀,则跳过
              continue;
            res+=size+1;
        }
        return res+words.back().size()+1;
        

    }
};

2.不反转+自定义排序

方法1在反转的时候使用了额外的空间,可以不用反转,自定义排序规则

按照字符串中最后一个单词的字典序进行排列

如time me bell排序之后是

  me 

time

bell

同时需要自己写函数判断后缀匹配

3.字典树

每个字符串反向建立字典树,后缀匹配转化为前缀匹配

代码如下:

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/105155912