• 1032. Stream of Characters


    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.

    Store the words in the trie with reverse order, and check the query string from the end

    class StreamChecker {
        class TrieNode {
            TrieNode[] children = new TrieNode[26];
            boolean isWord;
        }
    
        TrieNode root;
        StringBuilder sb;
    
        public StreamChecker(String[] words) {
            root = new TrieNode();
            sb = new StringBuilder();
            buildTrie(words);
        }
    
        private void buildTrie(String[] words) {
            for(String w : words) {
                TrieNode cur = root;
                for(int i = w.length() - 1; i >= 0; i--) {
                    if(cur.children[w.charAt(i) - 'a'] == null) {
                        cur.children[w.charAt(i) - 'a'] = new TrieNode();
                    }
                    cur = cur.children[w.charAt(i) - 'a'];
                }
                cur.isWord = true;
            }
        }
    
        public boolean query(char letter) {
            sb.append(letter);
            TrieNode cur = root;
            for(int i = sb.length() - 1; i >= 0 && cur != null; i--) {
                cur = cur.children[sb.charAt(i) - 'a'];
                if(cur != null && cur.isWord) {
                    return true;
                }
            }
            return false;
        }
    }
    
    /**
     * Your StreamChecker object will be instantiated and called as such:
     * StreamChecker obj = new StreamChecker(words);
     * boolean param_1 = obj.query(letter);
     */
  • 相关阅读:
    无法跨越程序集边界使用程序集,因为该成员包含的某个类型具有一个为嵌入互操作类型的泛型类型参数。
    arcengine右键实现new group layer的功能
    winform进度条
    arcgisengine实现矩形转面
    win10 SVN不能显示图标
    关于VS打包程序无法弹出主界面的问题
    ArcGIS Javascript 异常之No 'Access-Control-Allow-Origin' header
    ArcGIS JavaScript API异常之onExtentChange事件覆盖onClick事件
    ArcGIS AddIN 之 DockPanel 界面空白
    关于JQuery设置checkbox checked 的问题
  • 原文地址:https://www.cnblogs.com/fatttcat/p/13601298.html
Copyright © 2020-2023  润新知