zoukankan      html  css  js  c++  java
  • Leetcode 211 添加与搜索单词 前缀树

      JAVA:

    class WordDictionary {
            private Node head;
    
            /**
             * Initialize your data structure here.
             */
            public WordDictionary() {
                this.head = new Node(null);
            }
    
            /**
             * Adds a word into the data structure.
             */
            public void addWord(String word) {
                Node node = this.head;
                for (int i = 0; i < word.length(); i++) {
                    int chPoint = word.charAt(i) - 'a';
                    if (node.childs[chPoint] == null) node.childs[chPoint] = new Node(node);
                    else node.childs[chPoint].nums++;
                    node.hasChild = true;
                    node = node.childs[chPoint];
                }
                node.isEnd = true;
                node.pre.hasEndChild = true;
            }
    
            public boolean search(String word) {
                return search(word, this.head);
            }
    
            /**
             * Returns if the word is in the data structure. A word could contain the dot character '.' to represent any
             * one letter.
             */
            public boolean search(String word, Node node) {
                int len = word.length();
                for (int i = 0; i < len; i++) {
                    // 包含 . 进行全匹配
                    if (word.charAt(i) == '.') {
                        if (i == len - 1) return node.hasEndChild;
                        for (int j = 0; j < 26; j++) {
                            if (node.childs[j] == null) continue;
                            if (search(word.substring(i + 1, len), node.childs[j])) return true;
                        }
                        return false;
                    }
                    // 正常匹配
                    int chPoint = word.charAt(i) - 'a';
                    if (node.childs[chPoint] == null) return false;
                    node = node.childs[chPoint];
                }
                return node.isEnd;
            }
    
            private class Node {
                boolean isEnd;
                boolean hasChild;
                boolean hasEndChild;
                Node pre;
                Node[] childs;
                int nums;
    
                Node(Node pre) {
                    this.isEnd = false;
                    this.childs = new Node[26];
                    this.hasChild = false;
                    this.nums = 1;
                    this.pre = pre;
                    this.hasEndChild = false;
                }
            }
        }

      JS:

    /**
     * Initialize your data structure here.
     */
    var WordDictionary = function () {
        this.head = new Node(null);
    };
    
    /**
     * Adds a word into the data structure.
     * @param {string} word
     * @return {void}
     */
    WordDictionary.prototype.addWord = function (word) {
        Node
        node = this.head;
        for (let i = 0; i < word.length; i++) {
            let ch = word.charAt(i), chPoint = ch.charCodeAt() - 97;
            if (!node.childs[chPoint]) node.childs[chPoint] = new Node(node);
            else node.childs[chPoint].nums++;
            node = node.childs[chPoint];
        }
        node.isEnd = true;
        node.pre.hasEndChild = true;
    };
    
    /**
     * Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter.
     * @param {string} word
     * @return {boolean}
     */
    WordDictionary.prototype.search = function (word) {
        return this.search0(word, this.head);
    }
    
    
    WordDictionary.prototype.search0 = function (word, node) {
        let len = word.length;
        for (let i = 0; i < len; i++) {
            let ch = word.charAt(i), chPoint = ch.charCodeAt() - 97;
            if (ch == '.') {
                if (i == len - 1) return node.hasEndChild;
                for (let j = 0; j < 26; j++) {
                    if (!node.childs[j]) continue;
                    if (this.search0(word.substring(i + 1, len), node.childs[j])) return true;
                }
                return false;
            }
            if (!node.childs[chPoint]) return false;
            node = node.childs[chPoint];
        }
        return node.isEnd;
    };
    
    var Node = function (pre) {
        this.isEnd = false;
        this.childs = new Array(26);
        this.hasEndChild = false;
        this.pre = pre;
        this.nums = 1;
    }
    
    /**
     * Your WordDictionary object will be instantiated and called as such:
     * var obj = new WordDictionary()
     * obj.addWord(word)
     * var param_2 = obj.search(word)
     */

  • 相关阅读:
    前端基础进阶(四)-让你一分钟就看懂的作用域和作用域链
    前端基础进阶(三)-史上最详细的变量对象详解
    前端基础进阶(二)-知识点解析最精炼最详细
    前端基础进阶(一):内存空间详解-月薪5万
    知道这20个前端正则表达式,能让你做项目时少写1000行甚至一万行,真的
    学习web前端的免费12个学习网站,等你来撩
    一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!
    零基础的同学看过来,如何系统学习前端
    这是那些大佬程序员常用的学习java网站,这就是别人薪资上万的原因
    Debug outlook add-in (office.js) 小技巧
  • 原文地址:https://www.cnblogs.com/niuyourou/p/14226455.html
Copyright © 2011-2022 走看看