zoukankan      html  css  js  c++  java
  • 1032. Stream of Characters (H)

    Stream of Characters (H)

    题目

    Implement the StreamChecker class as follows:

    • StreamChecker(words): Constructor, init the data structure with the given words.
    • query(letter): returns true if and only if for some k >= 1, the last k characters queried (in order from oldest to newest, including this letter just queried) spell one of the words in the given list.

    Example:

    StreamChecker streamChecker = new StreamChecker(["cd","f","kl"]); // init the dictionary.
    streamChecker.query('a');          // return false
    streamChecker.query('b');          // return false
    streamChecker.query('c');          // return false
    streamChecker.query('d');          // return true, because 'cd' is in the wordlist
    streamChecker.query('e');          // return false
    streamChecker.query('f');          // return true, because 'f' is in the wordlist
    streamChecker.query('g');          // return false
    streamChecker.query('h');          // return false
    streamChecker.query('i');          // return false
    streamChecker.query('j');          // return false
    streamChecker.query('k');          // return false
    streamChecker.query('l');          // return true, because 'kl' is in the wordlist
    

    Note:

    • 1 <= words.length <= 2000
    • 1 <= words[i].length <= 2000
    • Words will only consist of lowercase English letters.
    • Queries will only consist of lowercase English letters.
    • The number of queries is at most 40000.

    题意

    给定一个单词字典,并按顺序一连串字母,判断字典中是否存在以当前输入字母为结尾的单词。

    思路

    找单词一般可以用字典树,同时注意到这里需要从单词末尾找到单词开头,所以构建字典树时也要倒着来。


    代码实现

    Java

    class StreamChecker {
        private Node root;
        private List<Character> queries;
    
        public StreamChecker(String[] words) {
            root = new Node();
            queries = new ArrayList<>();
            for (String word : words) {
                buildTrie(word);
            }
        }
    
        public boolean query(char letter) {
            queries.add(letter);
            Node p = root;
            for (int i = queries.size() - 1; i >= 0; i--) {
                char c = queries.get(i);
                if (p.children[c - 'a'] != null) {
                    p = p.children[c - 'a'];
                    if (p.end) {
                        return true;
                    }
                } else {
                    return false;
                }
            }
            return false;
        }
    
        private void buildTrie(String word) {
            Node p = root;
            for (int i = word.length() - 1; i >= 0; i--) {
                char c = word.charAt(i);
                if (p.children[c - 'a'] == null) {
                    p.children[c - 'a'] = new Node();
                }
                p = p.children[c - 'a'];
            }
            p.end = true;
        }
    }
    
    class Node {
        Node[] children;
        boolean end;
    
        Node() {
            children = new Node[26];
            end = false;
        }
    }
    
    /**
     * Your StreamChecker object will be instantiated and called as such:
     * StreamChecker obj = new StreamChecker(words); boolean param_1 =
     * obj.query(letter);
     */
    
  • 相关阅读:
    Parameter Binding in ASP.NET Web API
    Which HTTP methods match up to which CRUD methods?
    ErrorHandling in asp.net web api
    HttpStatusCode
    Autofac Getting Started(默认的构造函数注入)
    Autofac Controlling Scope and Lifetime
    luvit 被忽视的lua 高性能框架(仿nodejs)
    undefined与null的区别
    VsCode中使用Emmet神器快速编写HTML代码
    字符串匹配---KMP算法
  • 原文地址:https://www.cnblogs.com/mapoos/p/13552557.html
Copyright © 2011-2022 走看看