アルゴリズムの問題を解決する場合、データ構造を柔軟に使用することが重要です。この問題では、括弧のみを含む文字列が有効かどうか、つまり括弧が一致して正しく閉じることができるかどうかを判断する必要があります。この問題は、このデータ構造を使用すると栈
うまく解決できます。
質問リンク:有効な括弧
問題解決のアイデア: なぜスタックを使用するのでしょうか?
括弧の一致の問題では、入力文字列内の括弧が正しく閉じられているかどうかを判断する必要があり、括弧の順序も正しい必要があります。この場合、 を使用できます堆栈
。
スタックは、后进先出(LIFO)
ブラケット マッチングの問題を解決するのに非常に適したデータ構造です。
左括弧が見つかった場合はそれをスタックし、右括弧が压入
見つかった場合は一番上の要素をスタックして一致するかどうかを比較します。弹出
オリジナルコード
まず、元のソリューション コードを見てみましょう。
class Solution {
public:
bool isValid(string ex) {
stack<char> s;
for(char c : ex){
if(c == '(' || c == '[' || c == '{'){
s.push(c);
}else{
if(s.empty()){
return false;
}else{
if(c == ')' && s.top() == '('){
s.pop();
}
else if(c == '}' && s.top() == '{'){
s.pop();
}
else if(c == ']' && s.top() == '['){
s.pop();
}
else {
return false;
}
}
}
}
return s.empty();
}
};
最適化されたコード
ロジックを簡素化し、コードの読みやすさを向上させるために、ハッシュ テーブルを使用して括弧間の対応関係を保存し、スタックの基本操作と組み合わせて改善することができます。
class Solution {
public:
bool isValid(string s) {
stack<char> st;
unordered_map<char, char> mapping = {
{
')', '('},
{
']', '['},
{
'}', '{'}
};
for (char c : s) {
if (c == '(' || c == '[' || c == '{') {
st.push(c);
} else {
if (st.empty() || st.top() != mapping[c]) {
return false;
}
st.pop();
}
}
return st.empty();
}
};
スタックの基本操作を使用するためのヒント
この問題を解決する際に、スタックの基本操作を最大限に活用しました。
push
: 左側のブラケットをスタックに押し込みます。pop
: 右括弧が見つかったら、それをスタックから取り出し、現在の右括弧と比較して、一致するかどうかを確認します。top
: スタックの最上位要素が現在の右括弧と一致するかどうかを確認します。
これらの操作により、括弧が一致するかどうかを効率的に確認できます。
まとめと考察
括弧の一致問題は、スタックを使用して解決される典型的な問題です。左括弧をスタックにプッシュし、対応する右括弧が見つかったときにポップ マッチを実行することで、括弧が正しく閉じられているかどうかを効果的に判断できます。
元のコードはその役割を果たしましたが、存在しており冗长的 if-else 语句
、十分にエレガントではありませんでした。保存された括弧対応を使用すると哈希表
、より簡潔なコードで同じ機能を実現でき、コードの可読性と保守性が向上します。
ブラケット マッチング問題は、アルゴリズムにおけるスタックの小さな応用にすぎません。スタックには、逆ポーランド式評価、深さ優先検索など、他にも多くの強力な用途があります。スタックの基本操作と柔軟なアプリケーションをマスターすることは、アルゴリズムとデータ構造の理解を高めるのに非常に役立ちます。