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);
     */
    
  • 相关阅读:
    LOJ#10106. 「一本通 3.7 例 2」单词游戏
    小木棍(爆搜减枝)
    倍增求lca(模板)
    2018年第九届蓝桥杯C/C++A组省赛(最后一题)
    LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱
    【[APIO/CTSC2007]动物园】状压DP
    c++滚动数组
    状态压缩入门(附经典题目和题解)
    小 M 的算式(dfs)
    P与NP问题详解
  • 原文地址:https://www.cnblogs.com/mapoos/p/13552557.html
Copyright © 2011-2022 走看看