From dc1f0c4c0096013799416664894c5194dc7e1f52 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Fri, 28 Feb 2025 23:13:39 +0800 Subject: chore(store): move everything to store. --- store/works/solutions/leetcode/cpp/10.cpp | 83 +++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 store/works/solutions/leetcode/cpp/10.cpp (limited to 'store/works/solutions/leetcode/cpp/10.cpp') diff --git a/store/works/solutions/leetcode/cpp/10.cpp b/store/works/solutions/leetcode/cpp/10.cpp new file mode 100644 index 0000000..fbb5586 --- /dev/null +++ b/store/works/solutions/leetcode/cpp/10.cpp @@ -0,0 +1,83 @@ +#include +#include +#include + +using std::string; + +struct Token { + explicit Token(char c) : c(c), isAsterisk(false) {} + + char c; + bool isAsterisk; +}; + +class Solution { +public: + std::vector tokens_; + std::string s_; + std::unordered_map> cache_; + + bool isMatch(string s, string p) { + for (auto c : p) { + if (c == '*') { + tokens_.back().isAsterisk = true; + } else { + tokens_.push_back(Token{c}); + } + } + s_ = s; + + return match(0, 0, s_.size(), tokens_.size()); + } + + bool cache_match(int s_start, int t_start, int s_length, int t_length) { + auto cache = cache_[s_start][t_start]; + if (cache < 0) { + return false; + } else if (cache > 0) { + return true; + } else { + auto result = match(s_start, t_start, s_length, t_length); + cache_[s_start][t_start] = result; + return result; + } + } + + bool match(int s_start, int t_start, int s_length, int t_length) { + if (t_start == t_length) + return s_start == s_length; + + const auto &token = tokens_[t_start]; + if (token.isAsterisk) { + if (cache_match(s_start, t_start + 1, s_length, t_length)) { + return true; + } + + int s_index = s_start; + while (s_index < s_length) { + if (token.c == '.') { + if (cache_match(s_index + 1, t_start + 1, s_length, t_length)) + return true; + } else if (token.c == s_[s_index]) { + if (cache_match(s_index + 1, t_start + 1, s_length, t_length)) + return true; + } else { + break; + } + s_index++; + } + + return false; + } else { + if (token.c == '.') { + return cache_match(s_start + 1, t_start + 1, s_length, t_length); + } else { + if (token.c == s_[s_start]) { + return cache_match(s_start + 1, t_start + 1, s_length, t_length); + } else { + return false; + } + } + } + } +}; -- cgit v1.2.3