給定乙個由n個不重複非空字串組成的陣列,你需要按照以下規則為每個單詞生成最小的縮寫。
初始縮寫由起始字母+省略字母的數量+結尾字母組成。
若存在衝突,亦即多於乙個單詞有同樣的縮寫,則使用更長的字首代替首字母,直到從單詞到縮寫的對映唯一。換而言之,最終的縮寫必須只能對映到乙個單詞。
若縮寫並不比原單詞更短,則保留原樣。
例項:
輸入:[
"like"
,"god"
,"internal"
,"me"
,"internet"
,"interval"
,"intension"
,"face"
,"intrusion"
]輸出:
["l2e"
,"god"
,"internal"
,"me"
,"i6t"
,"interval"
,"inte4n"
,"f2e"
,"intr4n"
]
注意:
n和每個單詞的長度均不超過 400。
每個單詞的長度大於 1。
單詞只由英文小寫字母組成。
返回的答案需要和原陣列保持同一順序。
看到題目第一眼就感覺是要用字典樹了,但是奈何我忘了,只記得大概的思想,然後補習了一遍,參考了題解的一些做法做出來了= =
大概思路:
先把每個單詞根據它們的縮寫進行分組,同時再用乙個map記錄每個單詞在原單詞表中的位置
對分好組的單詞插入字典樹
通過字典樹的字首,判斷單詞的縮寫形式(詳情見下面**)
// 字典樹類
class
trie
;//字典樹的26個字數,代表26的字母'a'-'z'
int cnt =0;
//擁有該字首的單詞數量
void
insert
(string& s)}}
;class
solution
unordered_map>
::iterator it;
//迭代器
for(it=group.
begin()
; it!=group.
end(
); it++
)
tmp +
= strs[i]
[j];
//單詞字首增加
q = q-
>next[strs[i]
[j]-
'a'];}
ans[pos[strs[i]]]
= tmp;
//根據pos中每個單詞的原始位置,存放單詞的縮寫形式}}
return ans;}}
;
Leetcode 單雙字典樹
有n個只包含小寫字母的串s1 s2 sn 每次給你乙個只包含小寫字母的串t。如果串s存在字首s 它的奇數字的字元與t的奇數字字元完全相同,稱s為t的單匹配串,如果串s的偶數字字元與t的偶數字的字元全都相同,稱s為t的雙匹配串。現在給你m個字串,對於每個字串t,求s1 s2 sn 中有多少個串是t的單...
字典樹leetcode習題
給出乙個字串陣列words組成的一本英語詞典。從中找出最長的乙個單詞,該單詞是由words詞典中其他單詞逐步新增乙個字母組成。若其中有多個可行的答案,則返回答案中字典序最小的單詞。若無答案,則返回空字串。例項 輸入 words w wo wor worl world 輸出 world 解釋 單詞 w...
LeetCode字典樹 820單詞的壓縮編碼
給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢復我們之前的單詞...