生活随笔
收集整理的這篇文章主要介紹了
LeetCode 527. 单词缩写(Trie树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1. 題目
給定一個由n個不重復非空字符串組成的數組,你需要按照以下規則為每個單詞生成最小的縮寫。
- 初始縮寫由起始字母+省略字母的數量+結尾字母組成。
- 若存在沖突,亦即多于一個單詞有同樣的縮寫,則使用更長的前綴代替首字母,直到從單詞到縮寫的映射唯一。換而言之,最終的縮寫必須只能映射到一個單詞。
- 若縮寫并不比原單詞更短,則保留原樣。
示例
:
輸入
: ["like", "god", "internal", "me", "internet", "interval", "intension", "face", "intrusion"]
輸出
: ["l2e","god","internal","me","i6t","interval","inte4n","f2e","intr4n"]注意
:
n和每個單詞的長度均不超過
400。
每個單詞的長度大于
1。
單詞只由英文小寫字母組成。
返回的答案需要和原數組保持同一順序。
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/word-abbreviation
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 對字符串進行分組(首尾字符+長度),這種情況,縮寫才可能一樣
- 組內單詞插入trie樹,記錄每個節點的占用次數,如果只出現1個人占用的,即可以確定唯一的縮寫
class trie
{
public:trie
* next
[26] = {NULL};int freq
= 0;void insert(string
& s
){trie
* cur
= this;for(int i
= 0; i
< s
.size(); i
++){if(!cur
->next
[s
[i
]-'a'])cur
->next
[s
[i
]-'a'] = new trie();cur
= cur
->next
[s
[i
]-'a'];cur
->freq
++;}}
};
class Solution {
public:vector
<string
> wordsAbbreviation(vector
<string
>& dict
) {unordered_map
<string
, vector
<string
>> group
;unordered_map
<string
, int> w_id
;for(int i
= 0; i
< dict
.size(); ++i
){string g
= dict
[i
][0]+to_string(dict
[i
].size())+dict
[i
].back();group
[g
].push_back(dict
[i
]);w_id
[dict
[i
]] = i
;}vector
<string
> ans(dict
.size());for(auto& strs
: group
){trie
* t
= new trie(), *cur
= t
;for(auto& s
: strs
.second
)t
->insert(s
);for(auto& s
: strs
.second
){cur
= t
;string temp
;for(int i
= 0; i
< s
.size(); i
++){if(cur
->next
[s
[i
]-'a']->freq
== 1){int count
= s
.size()-i
-2;if(count
>= 2)temp
= s
.substr(0,i
+1)+to_string(count
)+s
.back();elsetemp
= s
;break;}cur
= cur
->next
[s
[i
]-'a'];}ans
[w_id
[s
]] = temp
;} }return ans
;}
};
332 ms 330.2 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 527. 单词缩写(Trie树)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。