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);
 */
原文地址:https://www.cnblogs.com/mapoos/p/13552557.html