题目

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:

  1. StreamChecker streamChecker = new StreamChecker(["cd","f","kl"]); // init the dictionary.
  2. streamChecker.query('a'); // return false
  3. streamChecker.query('b'); // return false
  4. streamChecker.query('c'); // return false
  5. streamChecker.query('d'); // return true, because 'cd' is in the wordlist
  6. streamChecker.query('e'); // return false
  7. streamChecker.query('f'); // return true, because 'f' is in the wordlist
  8. streamChecker.query('g'); // return false
  9. streamChecker.query('h'); // return false
  10. streamChecker.query('i'); // return false
  11. streamChecker.query('j'); // return false
  12. streamChecker.query('k'); // return false
  13. 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

  1. class StreamChecker {
  2. private Node root;
  3. private List<Character> queries;
  4. public StreamChecker(String[] words) {
  5. root = new Node();
  6. queries = new ArrayList<>();
  7. for (String word : words) {
  8. buildTrie(word);
  9. }
  10. }
  11. public boolean query(char letter) {
  12. queries.add(letter);
  13. Node p = root;
  14. for (int i = queries.size() - 1; i >= 0; i--) {
  15. char c = queries.get(i);
  16. if (p.children[c - 'a'] != null) {
  17. p = p.children[c - 'a'];
  18. if (p.end) {
  19. return true;
  20. }
  21. } else {
  22. return false;
  23. }
  24. }
  25. return false;
  26. }
  27. private void buildTrie(String word) {
  28. Node p = root;
  29. for (int i = word.length() - 1; i >= 0; i--) {
  30. char c = word.charAt(i);
  31. if (p.children[c - 'a'] == null) {
  32. p.children[c - 'a'] = new Node();
  33. }
  34. p = p.children[c - 'a'];
  35. }
  36. p.end = true;
  37. }
  38. }
  39. class Node {
  40. Node[] children;
  41. boolean end;
  42. Node() {
  43. children = new Node[26];
  44. end = false;
  45. }
  46. }
  47. /**
  48. * Your StreamChecker object will be instantiated and called as such:
  49. * StreamChecker obj = new StreamChecker(words); boolean param_1 =
  50. * obj.query(letter);
  51. */