From ac5b01f8ed802923ea5f7eaa8b21da5a80684c1f Mon Sep 17 00:00:00 2001 From: philip82148 <92205270+philip82148@users.noreply.github.com> Date: Sat, 8 Feb 2025 20:56:06 +0900 Subject: [PATCH 1/4] add 1.cpp & 1r.cpp --- 01-15/11.Valid-Parentheses/1.cpp | 56 +++++++++++++++++++++++++++++++ 01-15/11.Valid-Parentheses/1r.cpp | 36 ++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 01-15/11.Valid-Parentheses/1.cpp create mode 100644 01-15/11.Valid-Parentheses/1r.cpp diff --git a/01-15/11.Valid-Parentheses/1.cpp b/01-15/11.Valid-Parentheses/1.cpp new file mode 100644 index 0000000..8c1a9bb --- /dev/null +++ b/01-15/11.Valid-Parentheses/1.cpp @@ -0,0 +1,56 @@ +#if __has_include("../../debug.hpp") +#include "../../debug.hpp" +#endif +// ここまでローカルでのデバッグ用なので気にしないでください -------------------- + +#include + +using namespace std; + +// <時間> +// 10分 +// <感想> +// これ正直10分じゃ無理だろ、と思っていたが意外と書けて嬉しい。 +// 最初の方でどうするのがいいか少し時間を取って考えた。 +// 最初に思い付いたのがpre変数を用意して、 +// ひとつ前の文字に対応する括弧のみ受けつけ続けるみたいな(結局うまく行かなそう)。 +// そっから何かの拍子にstackを使うことを思いつき、 +// 途中でclosing_to_openingが必要になり +// switchで書いていたロジックをclosing_to_openingを使った +// ifに書き換えるという流れ +// <疑問・不安点(・個人的な感想、違う意見があれば教えてほしいもの)> +// - L39を空けるか否か +// - closing_to_openingとopening_bracketsのどちらを先に宣言するか +// (細かいけど...) +// +// +// +// +// +// L30(行数調整用コメント) +class Solution { + public: + bool isValid(string s) { + static const map closing_to_opening{ + {')', '('}, + {'}', '{'}, + {']', '['}, + }; + + stack opening_brackets; + for (auto c : s) { + if (auto it = closing_to_opening.find(c); + it != closing_to_opening.end()) { + auto opening = it->second; + if (!opening_brackets.empty() && opening_brackets.top() == opening) { + opening_brackets.pop(); + } else { + return false; + } + } else { + opening_brackets.push(c); + } + } + return opening_brackets.empty(); + } +}; diff --git a/01-15/11.Valid-Parentheses/1r.cpp b/01-15/11.Valid-Parentheses/1r.cpp new file mode 100644 index 0000000..ac352ce --- /dev/null +++ b/01-15/11.Valid-Parentheses/1r.cpp @@ -0,0 +1,36 @@ +#if __has_include("../../debug.hpp") +#include "../../debug.hpp" +#endif +// ここまでローカルでのデバッグ用なので気にしないでください -------------------- + +#include + +using namespace std; + +// <時間> +// 5分 +// <感想> +class Solution { + public: + bool isValid(const string &brackets) { + static const map closing_to_opening{ + {')', '('}, + {'}', '{'}, + {']', '['}, + }; + stack opening_brackets; + for (auto bracket : brackets) { + if (auto it = closing_to_opening.find(bracket); + it != closing_to_opening.end()) { + auto opening = it->second; + if (!(!opening_brackets.empty() && opening_brackets.top() == opening)) { + return false; + } + opening_brackets.pop(); + } else { + opening_brackets.push(bracket); + } + } + return opening_brackets.empty(); + } +}; From b50c7d71be157d0efa98dc2203a748b8c71de64c Mon Sep 17 00:00:00 2001 From: philip82148 <92205270+philip82148@users.noreply.github.com> Date: Sat, 8 Feb 2025 21:42:34 +0900 Subject: [PATCH 2/4] add 2.cpp --- 01-15/11.Valid-Parentheses/1.cpp | 14 ++++++++++++-- 01-15/11.Valid-Parentheses/{1r.cpp => 2.cpp} | 13 ++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) rename 01-15/11.Valid-Parentheses/{1r.cpp => 2.cpp} (66%) diff --git a/01-15/11.Valid-Parentheses/1.cpp b/01-15/11.Valid-Parentheses/1.cpp index 8c1a9bb..4843d0c 100644 --- a/01-15/11.Valid-Parentheses/1.cpp +++ b/01-15/11.Valid-Parentheses/1.cpp @@ -19,15 +19,25 @@ using namespace std; // switchで書いていたロジックをclosing_to_openingを使った // ifに書き換えるという流れ // <疑問・不安点(・個人的な感想、違う意見があれば教えてほしいもの)> -// - L39を空けるか否か +// - L49を空けるか否か // - closing_to_openingとopening_bracketsのどちらを先に宣言するか // (細かいけど...) +// <他の人のを見てコメント> +// - なるほど。そういえばValid ParenthesesもCSZAPで触れていたかもしれない。 +// https://discord.com/channels/1084280443945353267/1201211204547383386/1202541275115425822 +// - そうか、closing_to_openingじゃなくてもopening_to_closingでもよかったのか… +// うーん、でもその場合2回map::findすることになるな +// - stackに番兵を入れてstack::emptyを呼び出さなくていいようにしている +// ものがあった。頭いい。 +// - closing_to_opening定数だからスネークケースじゃなかったわ。 // // // // // -// L30(行数調整用コメント) +// +// +// L40(行数調整用コメント) class Solution { public: bool isValid(string s) { diff --git a/01-15/11.Valid-Parentheses/1r.cpp b/01-15/11.Valid-Parentheses/2.cpp similarity index 66% rename from 01-15/11.Valid-Parentheses/1r.cpp rename to 01-15/11.Valid-Parentheses/2.cpp index ac352ce..733a22c 100644 --- a/01-15/11.Valid-Parentheses/1r.cpp +++ b/01-15/11.Valid-Parentheses/2.cpp @@ -13,24 +13,23 @@ using namespace std; class Solution { public: bool isValid(const string &brackets) { - static const map closing_to_opening{ + static const map kClosingToOpening{ {')', '('}, {'}', '{'}, {']', '['}, }; stack opening_brackets; + opening_brackets.push('*'); // sentinel for (auto bracket : brackets) { - if (auto it = closing_to_opening.find(bracket); - it != closing_to_opening.end()) { + if (auto it = kClosingToOpening.find(bracket); + it != kClosingToOpening.end()) { auto opening = it->second; - if (!(!opening_brackets.empty() && opening_brackets.top() == opening)) { - return false; - } + if (opening_brackets.top() != opening) return false; opening_brackets.pop(); } else { opening_brackets.push(bracket); } } - return opening_brackets.empty(); + return opening_brackets.size() == 1; } }; From 010654044972fc956ff4e285193e19b3f24a2edf Mon Sep 17 00:00:00 2001 From: philip82148 <92205270+philip82148@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:52:00 +0900 Subject: [PATCH 3/4] add readme --- 01-15/11.Valid-Parentheses/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 01-15/11.Valid-Parentheses/README.md diff --git a/01-15/11.Valid-Parentheses/README.md b/01-15/11.Valid-Parentheses/README.md new file mode 100644 index 0000000..8ca741d --- /dev/null +++ b/01-15/11.Valid-Parentheses/README.md @@ -0,0 +1,3 @@ +# 20. Valid Parentheses + + From 434f8a452a43a73afa28c9e94873aed6c8c444c3 Mon Sep 17 00:00:00 2001 From: philip82148 <92205270+philip82148@users.noreply.github.com> Date: Wed, 23 Apr 2025 17:39:09 +0900 Subject: [PATCH 4/4] add 3-4.cpp --- 01-15/11.Valid-Parentheses/3.cpp | 49 ++++++++++++++++++++++++++++++++ 01-15/11.Valid-Parentheses/4.cpp | 48 +++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 01-15/11.Valid-Parentheses/3.cpp create mode 100644 01-15/11.Valid-Parentheses/4.cpp diff --git a/01-15/11.Valid-Parentheses/3.cpp b/01-15/11.Valid-Parentheses/3.cpp new file mode 100644 index 0000000..479f1ef --- /dev/null +++ b/01-15/11.Valid-Parentheses/3.cpp @@ -0,0 +1,49 @@ +#if __has_include("../../debug.hpp") +#include "../../debug.hpp" +#endif +// ここまでローカルでのデバッグ用なので気にしないでください -------------------- + +#include +#include +#include + +using namespace std; + +// <時間> +// 15分 +// <コメント> +// - corresponding_bracketとopen_bracketは最初逆に名前を付けていた。 +// - corresponding_bracketは最初corresponding_open_bracketとしていたが、 +// openはなくても伝わると思い消した。 +// - だが、読む側に取ってどう見えるかは分からない。 +// - correspondingみたいな意味の名前は付けることが多いと思うが、 +// もっと短めの単語はないものか。 +class Solution { + public: + bool isValid(const string &brackets) { + static const map kCloseToOpen{ + {')', '('}, + {'}', '{'}, + {']', '['}, + }; + stack open_brackets; + open_brackets.push('\0'); + for (auto bracket : brackets) { + // In the case `bracket` is an open bracket. + auto close_and_open = kCloseToOpen.find(bracket); + if (close_and_open == kCloseToOpen.end()) { + open_brackets.push(bracket); + continue; + } + + // In the case `bracket` is a close bracket. + auto open_bracket = close_and_open->second; + auto corresponding_bracket = open_brackets.top(); + open_brackets.pop(); + if (corresponding_bracket != open_bracket) { + return false; + } + } + return open_brackets.size() == 1; + } +}; diff --git a/01-15/11.Valid-Parentheses/4.cpp b/01-15/11.Valid-Parentheses/4.cpp new file mode 100644 index 0000000..186d5c9 --- /dev/null +++ b/01-15/11.Valid-Parentheses/4.cpp @@ -0,0 +1,48 @@ +#if __has_include("../../debug.hpp") +#include "../../debug.hpp" +#endif +// ここまでローカルでのデバッグ用なので気にしないでください -------------------- + +#include +#include +#include + +using namespace std; + +// <時間> +// 10分 +// <感想> +// 多分3.cppよりこっちの方が読みやすい。 +// <コメント> +// - auto open_bracket = open_brackets.top(); +// で新しく変数を作ろうかとも思ったが、無駄に変数が多くても +// 読みづらいかなと思い作らないことにした。 +class Solution { + public: + bool isValid(const string &brackets) { + static const map kOpenToClose{ + {'(', ')'}, + {'{', '}'}, + {'[', ']'}, + }; + stack open_brackets; + for (auto bracket : brackets) { + // In the case `bracket` is an open bracket. + if (kOpenToClose.contains(bracket)) { + open_brackets.push(bracket); + continue; + } + + // In the case `bracket` is a close bracket. + if (open_brackets.empty()) { + return false; + } + auto close_bracket = kOpenToClose.at(open_brackets.top()); + open_brackets.pop(); + if (bracket != close_bracket) { + return false; + } + } + return open_brackets.empty(); + } +};