题目
描述
给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列,括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
数据范围:字符串长度 0≤n≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
思路
采用进栈出栈的思想,先进后出,后进先出,如果碰到左字符,就进栈,如果遇到右字符,则它对应的左字符就应该出栈。如果没有对应的左字符或者栈为空,就说明输入字符串就是不合法的括号序列。
代码
python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串
# @return bool布尔型
#
class Solution:
def isValid(self , s: str) -> bool:
map_dict = {"{":"}", "(":")", "[":"]"}
storage = []
for ele in s:
if ele in map_dict.keys():
storage.append(ele)
else:
if( len(storage)==0) or ele != map_dict[storage[-1]]:
return False
else:
storage.pop()
if(len(storage)!=0):
return False
return True
c++版本:
class Solution {
public:
/**
*
* @param s string字符串
* @return bool布尔型
*/
bool isValid(string s) {
// write code here
string inp = s;
stack<int> stk;
for(int i=0; i<inp.size(); i++){
switch (inp[i]) {
case '[':
stk.push(inp[i]);
break;
case '(':
stk.push(inp[i]);
break;
case '{':
stk.push(inp[i]);
break;
case ')':
if(stk.empty() || stk.top()!='('){
return false;
}else{
stk.pop();
break;
}
case ']':
if(stk.empty() || stk.top()!='['){
return false;
}else{
stk.pop();
}
break;
case '}':
if(stk.empty() || stk.top()!='{'){
return false;
}else{
stk.pop();
}
break;
default:
break;
}
}
if(!stk.empty()){
return false;
}
return true;
}
};