Word Abbreviation

给一堆词,要求缩写成的(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;
    }
};

Last updated