跳转至

648.单词替换 (Medium)*

题目描述*

标签*

字典树;哈希表;

思路 & 代码*

前缀匹配,暴力截取前缀判断或字典树。之前都是用的数组,这里用哈希表实现字典树。这里结点里标记的作用是取较短的词根。

class TrieNode {
public:
    bool flag;
    unordered_map<char, TrieNode*> next;
    TrieNode() : flag(false) {}
};

class Solution {
private:
    TrieNode* root;
public:
    Solution() {
        root = new TrieNode();
    }
    string replaceWords(vector<string>& dict, string s) {
        if(s == "") {
            return "";
        }
        auto cur = root;
        // 构造字典树
        for(auto& word : dict) {
            cur = root;
            for(auto& c : word) {
                if(!cur->next.count(c)) {
                    cur->next[c] = new TrieNode();
                }
                cur = cur->next[c];
            }
            cur->flag = true;
        }
        string res;
        int start = 0;
        int end = 0;
        int len = s.length();
        for(int i = 0; i < len; i++) {
            if(s[i] == ' ') {
                continue;
            }
            cur = root;
            start = i;
            while(i < len && s[i] != ' ') {
                // 匹配词根,取最短词根
                if(cur->flag || !cur->next.count(s[i])) {
                    break;
                }
                cur = cur->next[s[i]];
                i++;
            }
            end = i;
            while(i < len && s[i] != ' ') {
                i++;
            }
            // 没找到词根
            if(!cur->flag) {
                end = i;
            }
            res += s.substr(start, end - start) + " ";
        }
        res.pop_back();
        return res;
    }
};
class TrieNode {
public:
    bool flag;
    vector<TrieNode*> next;
    TrieNode() : flag(false), next(vector<TrieNode*>(26, nullptr)) {}
};

class Solution {
private:
    TrieNode* root;
public:
    Solution() {
        root = new TrieNode();
    }
    string replaceWords(vector<string>& dict, string s) {
        if(s == "") {
            return "";
        }
        auto cur = root;
        // 构造字典树
        for(auto& word : dict) {
            cur = root;
            for(auto& c : word) {
                if(cur->next[c - 'a'] == nullptr) {
                    cur->next[c - 'a'] = new TrieNode();
                }
                cur = cur->next[c - 'a'];
            }
            cur->flag = true;
        }
        string res;
        int start = 0;
        int end = 0;
        int len = s.length();
        for(int i = 0; i < len; i++) {
            if(s[i] == ' ') {
                continue;
            }
            cur = root;
            start = i;
            while(i < len && s[i] != ' ') {
                if(cur->flag || cur->next[s[i] - 'a'] == nullptr) {
                    break;
                }
                cur = cur->next[s[i] - 'a'];
                i++;
            }
            end = i;
            while(i < len && s[i] != ' ') {
                i++;
            }
            // 没找到词根
            if(!cur->flag) {
                end = i;
            }
            res += s.substr(start, end - start) + " ";
        }
        res.pop_back();
        return res;
    }
};

最后更新: July 23, 2022