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.字典树
每个字符串反向建立字典树,后缀匹配转化为前缀匹配
代码如下: