問題の説明
文字 '('、 ')'、 '{'、 ')'、 '['、および ']'のみを含む文字列を指定して、指定された文字列が有効な
角かっこシーケンスであるかどうかを判別します。角かっこは正しい必要があります。順序は次のとおりです。閉じている場合、「()」と「()[] {}」はどちらも有効な角かっこシーケンスですが、「(]」と「([)]」は無効です。
入力の説明:
括弧内に文字列を入力します
出力の説明:
このブラケットが有効かどうかを出力します
例
例1
「[]」を入力してください
trueを出力
ソリューション
分析
- スタックデータ構造の助けを借りて、スタックなどの左括弧に遭遇することができ、右括弧がスタックから飛び出します
方法
- スタックデータ構造の助けを借りて、スタックなどの左括弧に遭遇する可能性があり、右括弧がスタックから飛び出します。
(PSのヒント:スタック内の左括弧と右括弧に遭遇する可能性があり、スペースを節約できます)
コード
// 思路1
public class Solution {
public boolean isValid (String s) {
if (s == null || s.length() == 0 || "".equals(s)) {
return true;
}
// write code here
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') {
stack.add(s.charAt(i));
continue;
}
if (stack.isEmpty()) return false;
if (s.charAt(i) == ')' && stack.pop() == '(') {
continue;
} else if (s.charAt(i) == ']' && stack.pop() == '[') {
continue;
} else if (s.charAt(i) == '}' && stack.pop() == '{') {
continue;
} else {
return false;
}
}
return stack.isEmpty();
}
// 小技巧
public boolean isValid2(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '[')
stack.push(']');
else if (c == '{')
stack.push('}');
else if (stack.empty() || stack.pop() != c)
return false;
}
return stack.empty();
}
}
時間計算量分析:
O(N):文字列をトラバースする回数はNであるため、時間計算量はO(N)です。
スペースの複雑さの分析:
O(N):すべての文字列が左括弧であると仮定すると、すべての文字列をスタックにプッシュする必要があるため、スペースの複雑さはO(N)です。
テストしたい場合は、Niuke.comのリンクに直接アクセスしてテストを行うことができます