LeetCode-20 Valid Parentheses

本文最后更新于:1 年前

题目描述

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’  的字符串,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例

示例 1:

输入: “()”
输出: true

示例 2:

输入: “()[]{}”
输出: true

示例 3:

输入: “(]”
输出: false

示例 4:

输入: “([)]”
输出: false

示例 5:

输入: “{[]}”
输出: true

思路

这道题主要考核怎么去匹配括号我们需要匹配的括号共三种'()' '[]' '{}'以及他们组合在一起的情况。如果元素是任意左括号就将其压入栈中,反之元素则为任意右括号,这个时候有几种情况

情况 说明
空栈 栈中无元素,此时却是右括号显然是没有匹配项的
‘)’ 栈顶不为’(‘,给出的示例 4 告诉我们必须在左括号后立即有与之匹配的右括号才合法
‘]’ 同’)’
‘}’ 同’)’

剩下一种便是括号匹配,此时我们就需要将栈顶元素弹出,继续判断下一个元素。最后判断一下栈中是否还剩余有元素,如果有则有括号没有匹配上。
 只需遍历字符串所以时间复杂度为 O(n),需要一个栈,最坏情况需要将整个字符串放到栈中(如全是左括号)故空间复杂度也为 O(n)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
bool IsValid(string s)
{
Stack<char> stack = new Stack<char>();
foreach (char ch in s)
{
if(ch == '(' || ch == '[' || ch == '{')
{
stack.Push(ch); // 压栈
}
else
{
if(stack.Count == 0) // 空栈
{
return false;
}
if(ch == ')' && stack.Peek() != '(') // ()不匹配
{
return false;
}
if(ch == ']' && stack.Peek() != '[') // []不匹配
{
return false;
}
if(ch == '}' && stack.Peek() != '{') // {}不匹配
{
return false;
}
stack.Pop(); // 匹配上了
}
}
return stack.Count == 0; // 如果栈中还有元素则代表有多余的括号没有匹配上
}

LeetCode-20 Valid Parentheses
https://trickyrat.github.io/2020/04/09/LeetCode-20/
作者
trickyrat
发布于
2020年4月9日
许可协议