Conversation
05ryt31
left a comment
There was a problem hiding this comment.
普段C++を書かない自分でもとても読みやすいコード、memoだと思いました。
xbam326
left a comment
There was a problem hiding this comment.
step2で他の人のコードを読んで考えたことや、良かった点をまとめるとより学びが得られるのではないかと思いました。
| if (match.count(c)) { | ||
| st.push(c); | ||
| continue; | ||
| } else if (!st.empty() && match[st.top()] == c ) { | ||
| st.pop(); | ||
| continue; | ||
| } |
There was a problem hiding this comment.
resumit30minutes/leetcode-arai60-practice#7 (comment)
問題上起こりえないですが、こちらのディスカッションでは意図しない文字が入ってきた場合はどうするか?ということが議論されておりました。
今回のコードではFalseを返すと思っており、私もFalseを返すorエラーを吐くのが良いのでは?と思っているのですが、そうではないと考える方もおり、多角的な意見が学べたので紹介します。
There was a problem hiding this comment.
ありがとうございます。
第一義的にはerrを返して終了すべきだと考えます(今回の場合はfalse返すしかないですが)。
PythonもC++も、普通にアクセスしてしまうと新しくkeyが作成されてしまうと認識しているので、事前にその要素があるか、cppなら.count()、pythonなら"key" in D等でチェックするのが安全な設計をするなら望ましいとも思います。
| if (match.count(c)) { | ||
| st.push(c); | ||
| continue; | ||
| } else if (!st.empty() && match[st.top()] == c ) { |
There was a problem hiding this comment.
私はここ else 消します。上が continue なので。
また、条件はひっくり返して、return false; を中にいれます。
いずれも趣味の範囲です。
まあ、あとは、この問題はプッシュダウンオートマトンを連想するので、一応それは確認してみてください。たぶん、完走した人とかを調べると誰かよくまとめているでしょう。「in: レビュー依頼 55」あたりで検索すると完走した人たちが出てきます。
There was a problem hiding this comment.
continueの後のelseを残すかは悩みどころでした。可読性の面からつけたほうがいいかなと思っていましたが、むしろコード量が増えてしまうので避けても良さそうです。個人的にもシンプルなほうが好きなので次回からはそうしようと思います。
正常系・異常系のどちらかをifブロックに入れるなら異常系とも思います。こちらも意識します。
プッシュダウンオートマトン(というよりオートマトンという概念自体)については存じ上げなかったのですが、幸いBNFに基づいた再帰下降構文解析は書いたことがあるので、この問題でも実装してみます。
| bool isValid(std::string s) { | ||
| std::stack<char> st; | ||
|
|
||
| std::unordered_map<char, char> match = { |
There was a problem hiding this comment.
現状のままでもそんなにわかりづらくはないですが、自分であれば matched_parentheses ないし open_to_close とするかなと思います。
There was a problem hiding this comment.
確かに、結局何が入っているのか変数名から理解できないですね。ご指摘ありがとうございます。
20. Valid Parentheses