给一堆词,要求缩写成的(prefix+中间字符数 +最后一个字符) 能够确定唯一的词。直观的解法是对每个词首先初始化成最简单的缩写,然后对每个词检查是否有其它单词和它缩写一样,一样就把缩写加一位,再检查直到彻底没有相同的prefix后记录下缩写,依此类推处理下个词。查词还能用trie做,把所有词扔到trie里,并让trie的每个结点记录下被访问了几次,然后再DFS trie,到结点count为1时就可以缩写了。
class Solution {
public:
vector<string> wordsAbbreviation(vector<string>& dict) {
const int N = dict.size();
vector<string> res(N);
vector<int> pre(N, 1);
const auto abbr = [](string s, int k) {
return (k >= s.length() - 2) ? s : s.substr(0, k) + to_string(s.length() - k - 1) + s.back();
};
for (int i = 0; i < N; ++i) {
res[i] = abbr(dict[i], pre[i]);
}
for (int i = 0; i < N; ++i) {
while (true) {
unordered_set<int> s;
for (int j = i + 1; j < N; ++j) {
if (res[i] == res[j]) s.insert(j);
}
if (s.empty()) break;
s.insert(i);
for (const auto &a : s) {
res[a] = abbr(dict[a], ++pre[a]);
}
}
}
return res;
}
};