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)
     */

  • 相关阅读:
    String
    Xposed源码编译踩坑实录
    Hello 博客园
    HDU 1430 关系映射 + 打表 .
    HDU 1430 关系映射 + 打表 .
    hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
    hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
    hdu 1044 BFS(压缩图)+DFS
    hdu 1044 BFS(压缩图)+DFS
    hdu3338 最大流
  • 原文地址:https://www.cnblogs.com/niuyourou/p/14226455.html
Copyright © 2011-2022 走看看