[Swift]LeetCode1032. 字符流 | 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 somek >= 1
, the lastk
characters queried (in order from oldest to newest, including this letter just queried) spell one of the words in the given list.
Example:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。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.
按下述要求实现 StreamChecker
类:
StreamChecker(words)
:构造函数,用给定的字词初始化数据结构。query(letter)
:如果存在某些k >= 1
,可以用查询的最后k
个字符(按从旧到新顺序,包括刚刚查询的字母)拼写出给定字词表中的某一字词时,返回true
。否则,返回false
。
示例:
StreamChecker streamChecker = new StreamChecker(["cd","f","kl"]); // 初始化字典 streamChecker.query('a'); // 返回 false streamChecker.query('b'); // 返回 false streamChecker.query('c'); // 返回 false streamChecker.query('d'); // 返回 true,因为 'cd' 在字词表中 streamChecker.query('e'); // 返回 false streamChecker.query('f'); // 返回 true,因为 'f' 在字词表中 streamChecker.query('g'); // 返回 false streamChecker.query('h'); // 返回 false streamChecker.query('i'); // 返回 false streamChecker.query('j'); // 返回 false streamChecker.query('k'); // 返回 false streamChecker.query('l'); // 返回 true,因为 'kl' 在字词表中。
提示:
1 <= words.length <= 2000
1 <= words[i].length <= 2000
- 字词只包含小写英文字母。
- 待查项只包含小写英文字母。
- 待查项最多 40000 个。
1 class StreamChecker { 2 var root:TrieNode? 3 var stream:[Int] 4 init(_ words: [String]) { 5 stream = [Int]() 6 root = TrieNode() 7 for word in words 8 { 9 var arrWord:[Int] = Array(word).map{$0.ascii - 97} 10 var m:Int = word.count 11 var cur:TrieNode? = root 12 for i in stride(from:m - 1,through:0,by:-1) 13 { 14 if cur?.children[arrWord[i]] == nil 15 { 16 cur?.children[arrWord[i]] = TrieNode() 17 } 18 cur = cur?.children[arrWord[i]] 19 } 20 cur?.is_word = true; 21 } 22 } 23 24 func query(_ letter: Character) -> Bool { 25 stream.append(letter.ascii) 26 var m:Int = stream.count 27 var cur:TrieNode? = root 28 for i in stride(from:m - 1,through:0,by:-1) 29 { 30 cur = cur?.children[stream[i] - 97] 31 if cur == nil {return false} 32 else if cur!.is_word {return true} 33 } 34 return false 35 } 36 } 37 38 class TrieNode{ 39 var is_word:Bool 40 var children:[TrieNode?] 41 init() 42 { 43 is_word = false 44 children = [TrieNode?](repeating:nil,count:26) 45 } 46 } 47 48 //Character扩展 49 extension Character 50 { 51 //Character转ASCII整数值(定义小写为整数值) 52 var ascii: Int { 53 get { 54 return Int(self.unicodeScalars.first?.value ?? 0) 55 } 56 } 57 } 58 59 /** 60 * Your StreamChecker object will be instantiated and called as such: 61 * let obj = StreamChecker(words) 62 * let ret_1: Bool = obj.query(letter) 63 */

更多精彩