From 06152cca839ec8ad226f3f0ef7528b9b4453f182 Mon Sep 17 00:00:00 2001 From: Lam Haoyin Date: Fri, 28 Jan 2022 19:34:12 +0800 Subject: [PATCH] add: 220128 --- 2201/220128.cpp | 101 ++++++++++++++++++++++++++++++++++++++++++++ 2201/CMakeLists.txt | 2 +- 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 2201/220128.cpp diff --git a/2201/220128.cpp b/2201/220128.cpp new file mode 100644 index 0000000..953878f --- /dev/null +++ b/2201/220128.cpp @@ -0,0 +1,101 @@ +#include +#include +#include + +struct Node { + Node* children[27] {}; + + Node() = default; + + ~Node() { + for (auto*& ptr : this->children) { + delete ptr; + } + } +}; + +/** + * 211. Design Add and Search Words Data Structure + * Design a data structure that supports adding new words and finding if a string matches any previously added string. + * + * Implement the WordDictionary class: + * + * WordDictionary() Initializes the object. + * void addWord(word) Adds word to the data structure, it can be matched later. + * bool search(word) Returns true if there is any string in the data structure that matches word or false otherwise. word may contain dots '.' where dots can be matched with any letter. + */ + +class WordDictionary { +private: + Node root; +public: + WordDictionary() = default; + + void addWord(const std::string& word) { + Node* ptr = &this->root; + for (char ch : word) + ptr = ptr->children[ch - 'a'] = ((ptr->children[ch - 'a']) ? (ptr->children[ch - 'a']) : new Node()); + ptr->children[26] = new Node(); + } + + bool search(const std::string& word) const { + int n = word.length(); + std::queue> q; + q.push({&this->root, 0}); + while (!q.empty()) { + const auto t = q.front(); + q.pop(); + if (!t.first) + continue; + if (t.second == n) { + if (t.first->children[26]) + return true; + continue; + } + if (word[t.second] == '.') { + for (const auto* const& ptr : t.first->children) { + q.push({ptr, 1 + t.second}); + } + } else { + q.push({t.first->children[word[t.second] - 'a'], 1 + t.second}); + } + } + return false; + } +}; + +int main() { + { + WordDictionary wordDictionary; + wordDictionary.addWord("bad"); + wordDictionary.addWord("dad"); + wordDictionary.addWord("mad"); + std::cout << wordDictionary.search("pad"); // return False + std::cout << wordDictionary.search("bad"); // return True + std::cout << wordDictionary.search(".ad"); // return True + std::cout << wordDictionary.search("b.."); // return True + } + std::cout << std::endl; + { + WordDictionary wordDictionary; + wordDictionary.addWord("at"); + wordDictionary.addWord("and"); + wordDictionary.addWord("an"); + wordDictionary.addWord("add"); + // wordDictionary.addWord("a"); + std::cout << wordDictionary.search("a"); // return False + } + { + WordDictionary wordDictionary; + wordDictionary.addWord("ran"); + wordDictionary.addWord("rune"); + wordDictionary.addWord("runner"); + wordDictionary.addWord("runs"); + wordDictionary.addWord("add"); + wordDictionary.addWord("adds"); + wordDictionary.addWord("adder"); + wordDictionary.addWord("addee"); + wordDictionary.search("add."); + } + return 0; +} diff --git a/2201/CMakeLists.txt b/2201/CMakeLists.txt index 8431c7a..61b2ba4 100644 --- a/2201/CMakeLists.txt +++ b/2201/CMakeLists.txt @@ -3,4 +3,4 @@ PROJECT(2201) SET(CMAKE_CXX_STANDARD 23) -ADD_EXECUTABLE(2201 220128-CN.cpp) +ADD_EXECUTABLE(2201 220128.cpp)