diff --git a/Jongeun/Day16/211_DesignAddandSearchWordsDataStructure.cpp b/Jongeun/Day16/211_DesignAddandSearchWordsDataStructure.cpp new file mode 100644 index 0000000..bc4bccb --- /dev/null +++ b/Jongeun/Day16/211_DesignAddandSearchWordsDataStructure.cpp @@ -0,0 +1,99 @@ + +struct TrieNode +{ + TrieNode *ChildNode[26]; + bool isEnd; + TrieNode() + { + for (int i = 0; i < 26; i++) + { + ChildNode[i] = nullptr; + } + isEnd = false; + } +}; + +class WordDictionary +{ +public: + WordDictionary() + { + root = new TrieNode(); + } + + void addWord(string word) + { + TrieNode *cur = root; + for (auto c : word) + { + if (cur->ChildNode[c - 'a'] == nullptr) + { + TrieNode *temp = new TrieNode(); + cur->ChildNode[c - 'a'] = temp; + cur = temp; + } + else + { + cur = cur->ChildNode[c - 'a']; + } + } + + cur->isEnd = true; + } + + bool search(string word) + { + TrieNode *cur = root; + return _search(root, word); + } + + bool _search(TrieNode *node, string word) + { + if (word.empty()) + { + return node->isEnd == true; + } + + TrieNode *cur = node; + for (int i = 0; i < word.size(); i++) + { + if (word[i] == '.') + { + bool searched = false; + for (int j = 0; j < 26; j++) + { + if (cur->ChildNode[j] != nullptr) + { + searched = _search(cur->ChildNode[j], word.substr(i + 1)); + } + if (searched == true) + { + return true; + } + } + + return false; + } + else if (cur->ChildNode[word[i] - 'a'] == nullptr) + { + return false; + } + else + { + cur = cur->ChildNode[word[i] - 'a']; + } + } + + return cur->isEnd == true; + } + +private: + TrieNode *root; +}; + +/** + * Your WordDictionary object will be instantiated and called as such: + * WordDictionary* obj = new WordDictionary(); + * obj->addWord(word); + * bool param_2 = obj->search(word); + */ diff --git a/Jongeun/Day16/46_Permutations.cpp b/Jongeun/Day16/46_Permutations.cpp new file mode 100644 index 0000000..b0065ed --- /dev/null +++ b/Jongeun/Day16/46_Permutations.cpp @@ -0,0 +1,37 @@ +class Solution +{ +public: + vector> permute(vector &nums) + { + vector> res; + vector ans; + unordered_map m; + for (auto i : nums) + { + m[i] = 1; + } + _permute(res, ans, m); + return res; + } + + void _permute(vector> &res, vector &ans, unordered_map &m) + { + if (ans.size() == m.size()) + { + res.push_back(ans); + return; + } + + for (auto &it : m) + { + if (it.second == 1) + { + it.second--; + ans.push_back(it.first); + _permute(res, ans, m); + ans.pop_back(); + it.second++; + } + } + } +}; diff --git a/Jongeun/Day16/973_KClosestPointstoOrigin.cpp b/Jongeun/Day16/973_KClosestPointstoOrigin.cpp new file mode 100644 index 0000000..ab089d9 --- /dev/null +++ b/Jongeun/Day16/973_KClosestPointstoOrigin.cpp @@ -0,0 +1,24 @@ +class Solution +{ +public: + vector> kClosest(vector> &points, int k) + { + priority_queue>, vector>>, std::greater>>> pq; // min heap + vector> result; + for (auto &v : points) + { + double origin = sqrt(pow(v[0], 2) + pow(v[1], 2)); + pq.push({origin, v}); + } + + while (k > 0) + { + auto p = pq.top(); + pq.pop(); + result.push_back(p.second); + k--; + } + + return result; + } +};