题解 | #字典树的实现#

字典树的实现

http://www.nowcoder.com/practice/a55a584bc0ca4a83a272680174be113b

struct TrieNode {
    int cnt;
    bool end;
    TrieNode* next[26] = {nullptr};
    TrieNode() {
        cnt = 1;
        end = false;
        for (int i = 0; i < 26; i++) next[i] = nullptr;
    }
};
class Solution {
public:
    /**
     * 
     * @param operators string字符串vector<vector<>> the ops
     * @return string字符串vector
     */
    TrieNode* phead = new TrieNode();
    void insert(string word) {
        TrieNode* p = phead;
        for (char ch : word) {
            if (p->next[ch - 'a'] == nullptr) {
                p->next[ch - 'a'] = new TrieNode();
            } else {
                p->next[ch - 'a']->cnt++;
            }
            p = p->next[ch - 'a'];
        }
        p->end = true;
    }

    int prefixNumber(string pre) {
        int ans = INT_MAX;
        TrieNode* p = phead;
        for (char ch : pre) {
            if (p->next[ch - 'a'] == nullptr) return 0;
            ans = min(ans, p->next[ch - 'a']->cnt);
            p = p->next[ch - 'a'];
        }
        return ans;
    }

    void Delete(string word) {
        TrieNode* p = phead;
        for (char ch : word) {
            if (p->next[ch - 'a']->cnt == 1) {
                p->next[ch - 'a'] = nullptr;
                return;
            } else {
                p->next[ch - 'a']->cnt--;
                p = p->next[ch - 'a'];
            }
        }
    }

    bool search(string word) {
        TrieNode* p = phead;
        for (char ch : word) {
            if (p->next[ch - 'a'] == nullptr) return false;
            p = p->next[ch - 'a'];
        }
        return p->end;
    }
    vector<string> trieU(vector<vector<string> >& operators) {
        // write code here
        vector<string> ans;
        for (auto op : operators) {
            string num = op[0], word = op[1];
            if (num == "1") insert(word);
            else if (num == "2") Delete(word);
            else if (num == "3") {
                if (search(word)) {
                    ans.push_back("YES");
                } else {
                    ans.push_back("NO");
                }
            }
            else if (num == "4") {
                int cnt = prefixNumber(word);
                ans.push_back(to_string(cnt));
            }
        }
        return ans;
    }
};
全部评论

相关推荐

02-15 09:23
已编辑
深圳技术大学 Java
德勤 后端 OC 实习140/天,转正税前7k
恶龙战士:不如码农烧烤
点赞 评论 收藏
分享
02-02 20:25
门头沟学院 Java
数学转码崽:八股文也算是前人总结的精华,但是因为全是结果导向,你光背不去理解它背后的深层原理和这样做的原因,反而忽略了程序员最该重视的过程导向。推荐你不会的就去多问ai,比如我当时背的时候,concurrenthashmap底层原理常见八股网站都会讲,但是我不理解为什么它去用synchronize锁节点,为什么不用reentrantlock去锁节点。面试官问我你为什么觉得synchronize在这个场景下性能更好呢?虽然面试官可能也不确定清楚,但是你可以尝试给他解答,让他看见你的思考,这才是最重要的,毕竟你没实习,你的项目你也无法证明是你自己思考的产物,那就在别的地方体现你的能力
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务