题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
思路
关于这道题的思路,邓俊辉讲的非常好 视频地址。
使用栈,遍历输入字符串
如果当前字符为左半边括号时,则将其压入栈中
如果遇到右半边括号时,分类讨论:
1)如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环
2)若此时栈为空,则直接返回false
3)若不为对应的左半边括号,反之返回false
Python
技巧:若栈为空,匹配 ')' or ']' or '}',直接返回false
class Solution:
def isValid(self, s: str) -> bool:
val = []
val_map = {'(':')', '[':']', '{':'}'}
for i in s:
if len(val) == 0 and (i == ')' or i == ']' or i =='}'):
return False
if i in val_map:
val.append(val_map[i])
else:
if len(val) != 0:
top_val = val.pop()
if top_val != i:
return False
else:
continue
else:
return False
return len(val) == 0
C++
技巧2:判断左右括号是否匹配,从ASCII码表中,()相差1,[]与{}都是相差2的,所以当右边的括号减去左边的括号为1或者2的时候,说明括号匹配了。
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(int i=0;i<s.size();i++)
{
if(st.empty()&&(s[i]==')'||s[i]=='}'||s[i]==']'))
return false; //栈空,遇到右边的括号,直接返回false
if(s[i]==')'||s[i]=='}'||s[i]==']') //遇到右边的括号,判断栈顶是否
{ //是对应的左边的括号。
if(s[i]-st.top()==1||s[i]-st.top()==2)
st.pop(); //对应的话,栈顶元素退栈。
else
return false; //不对应的话,直接返回false。
}
else
st.push(s[i]); //遇到左边的括号,进栈。
}
return st.empty(); //栈空,说明括号都匹配了。
}
};