给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。
例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]。
对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表。
那么成功对给定单词列表进行编码的最小字符串长度是多少呢?
示例:
输入: words = ["time", "me", "bell"]
输出: 10
说明: S = "time#bell#" , indexes = [0, 2, 5] 。
提示:
1 <= words.length <= 2000
1 <= words[i].length <= 7
每个单词都是小写字母 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/short-encoding-of-words
bool cmp(string a,string b) { return a.length()<b.length(); } const int maxnode=14000+10; const int sigma_size=26; struct trie{ int ch[maxnode][sigma_size]; int val[maxnode]; int sz; trie(){ sz=1; memset(val,0,sizeof(val)); memset(ch[0],0,sizeof(ch[0])); } int idx(char c){return c-‘a‘;} int iinsert(string s){ int u=0,n=s.length(); int num=n+1; for(int i=n-1;i>=0;i--){ int c=idx(s[i]); if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz]=0; ch[u][c]=sz++; } u=ch[u][c]; if(val[u]==2){ num=(num-(n-i)-1); val[u]=1; } } val[u]=2; return num; } }; class Solution { public: int minimumLengthEncoding(vector<string>& words) { int num=0; trie a; sort(words.begin(),words.end(),cmp); for(int i=0;i<words.size();i++){ num+=a.iinsert(words[i]); } return num; } };
原文地址:https://www.cnblogs.com/wz-archer/p/12589862.html
时间: 2024-11-09 08:58:56