20. 有効な括弧
文字 '('、')'、'{'、'}'、'['、および ']' のみを含む文字列 s を指定すると、入力文字列が有効かどうかを判断します。
入力文字列は次の場合に有効です。
- 開いた括弧は同じ種類の括弧で閉じなければなりません。
- 開き括弧は正しい順序で閉じる必要があります。
- すべての閉じ括弧には、同じタイプの対応する開き括弧があります。
例 1:
入力: s = "()"
出力: true
例 2:
入力: s = “()[]{}”
出力: true
例 3:
入力: s = “(]”
出力: false
制約:
- 1 < = s 。長さ < = 1 0 4 1 <= s.length <= 10^41<=s 。長さ_ _ _ _<=1 04
- s は括弧「()[]{}」のみで構成されます。
From: LeetCode
Link: 20. 有効な括弧
解決:
アイデア:
文字列に有効な括弧が含まれているかどうかを判断するには、スタックを使用できます。アプローチは次のとおりです。
- 空のスタックを作成します。
- 文字列を一度に 1 文字ずつ走査します。
- 各キャラクターについて:
- それが左括弧 ((、{、または [) の場合は、スタックにプッシュします。
- 右括弧 ()、}、または ]) の場合は、スタックが空かどうかを確認します。空の場合は、一致する左括弧がないため、false を返します。
- スタックが空でない場合は、最上位要素をポップし、それが現在の閉じ括弧に対応する開始括弧と一致するかどうかを確認します。そうでない場合は false を返します。
- 文字列内のすべての文字を処理した後、スタックが空かどうかを確認します。空の場合は、すべての左括弧が一致しているため、true を返します。それ以外の場合は false を返します。
コード:
bool isValid(char * s) {
int n = strlen(s);
char *stack = (char *)malloc(n * sizeof(char));
int top = -1; // stack is empty initially
for (int i = 0; i < n; i++) {
if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
// Push the character onto the stack
stack[++top] = s[i];
} else {
// Check for matching opening bracket
if (top == -1) {
// No opening bracket to match
free(stack);
return false;
}
char openBracket = stack[top--]; // Pop the top of the stack
if (s[i] == ')' && openBracket != '(') {
free(stack);
return false;
}
if (s[i] == '}' && openBracket != '{') {
free(stack);
return false;
}
if (s[i] == ']' && openBracket != '[') {
free(stack);
return false;
}
}
}
bool result = (top == -1);
free(stack);
return result;
}