• 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);
     */
    
  • 相关阅读:
    使用DRF视图集时自定义action方法
    DRF视图集的路由设置
    DRF视图集的使用
    DRF最高封装的子类视图
    SQL Stored Procedure and Function
    Struts & Hibernate & Spring
    Java Knowledge series 5
    Android OS Startup
    Java Knowledge series 4
    Refactoring in Coding
  • 原文地址:https://www.cnblogs.com/mapoos/p/13552557.html
Copyright © 2020-2023  润新知