問題解決のアイデア:
- 括弧シーケンスの妥当性を判断しやすくするために、空のスタックを作成します。
- 指定された文字列を文字ごとに繰り返します。
- 文字が左括弧 (
(
、[
、{
) の場合、それをスタックにプッシュします。 - 文字が右括弧 (
)
、]
、}
) の場合は、スタックが空かどうかを確認します。- スタックが空で、開き括弧よりも閉じ括弧が多く、括弧の順序が無効であることを示している場合は、False を返します。
- スタックが空でない場合は、スタックの最上位要素をポップし、ポップされた左括弧が現在の右括弧と一致するかどうかを確認します。
- 一致しない場合、括弧のシーケンスは無効であり、False が返されます。
- 一致する場合は、次の文字に進みます。
- 走査後、スタックが空かどうかを確認します。
- スタックが空の場合は、すべての開始括弧に一致する終了括弧があり、括弧のシーケンスが有効であることを意味し、True を返します。
- スタックが空ではなく、左括弧が右括弧よりも多く、括弧の順序が無効であることを示している場合は、False を返します。
コードの実装とコメント:
def is_valid_parentheses(s):
# 创建一个空栈
stack = []
# 遍历字符串
for char in s:
if char in ['(', '[', '{']:
# 左括号,压入栈
stack.append(char)
else:
# 右括号,检查栈是否为空
if not stack:
# 栈为空,右括号多于左括号,无效
return False
# 弹出栈顶元素
top = stack.pop()
# 检查弹出的左括号与当前右括号是否匹配
if (top == '(' and char != ')') or (top == '[' and char != ']') or (top == '{' and char != '}'):
# 括号不匹配,无效
return False
# 检查栈是否为空
return len(stack) == 0
# 测试
s = "()"
result = is_valid_parentheses(s)
print(result) # 输出: True,因为括号序列有效
s = "()[]{}"
result = is_valid_parentheses(s)
print(result) # 输出: True,因为括号序列有效
s = "(]"
result = is_valid_parentheses(s)
print(result) # 输出: False,因为括号序列无效
s = "([)]"
result = is_valid_parentheses(s)
print(result) # 输出: False,因为括号序列无效
このアルゴリズムの時間計算量は O(n) です。ここで、n は文字列の長さです。アルゴリズムの実行中に、文字列を 1 回トラバースし、スタック上でプッシュおよびポップ操作を実行する必要があります。各キャラクターは最大 1 回プッシュおよびポップされるため、合計時間の計算量は線形です。