1.题目
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
2.收获
(1)数据结构没学好,看了很久才搞懂官方解答
(2)结合图像来看代码更容易懂
(3)要多做一些数据结构的题目了
3.解答
(1)Python版
class Solution:
def isValid(self,s:str)->bool:
dic={'{':'}','[':']','(':')','?':'?'} #建立哈希表
stack=['?']
for c in s:
if c in dic:
stack.append(c)
elif dic[stack.pop()]!=c:
return False #是左括号就入栈,是右括号就出栈
return len(stack)==1 #别忘了一开始有个‘?’
(2)c++版
class Solution {
public:
bool isValid(string s) {
int n=s.size();
if(n%2==1){
return false;
}
unordered_map<char,char>pairs={
{')','('},{'}','{'},{']',']'}//注意括号别写反了
};
stack<char>stk;
for(char ch:s){
if(pairs.count(ch)){
if(stk.empty()||stk.top()!=pairs[ch]){
return false;
}
stk.pop();//右括号弹出
}
else{
stk.push(ch);//左括号进入
}
}
return stk.empty();
}
};
注:unordered_map中count()函数的用法:存在查找的对象就返回查找的个数,否则返回0。与之对应的是find()函数,返回值为该迭代器在数据结构所在位置。