题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例:
输入:s = "()" 输出:true
基础知识:
unordered_map (无键值排序、哈希表)(一般int,string,double以及无序考虑,时间复杂度为O(1))
map (按照键值排序、平衡二叉树、时间复杂度O(logn))
以上没有任何区别,一般从时间复杂度考虑第一个
stack<char>stk 创建一个char型的栈,名为stk
for (char c : s) 遍历字符s,输出c为s的第n个字符,第一次循环为s的第0个字符(代码=for(int i=0;i<s.length();i++)))
if(pairs.cout(ch) ) ch为key,若该键值存在,则count返回1,如果key不存在,则count返回0,若输出结果不为0则进入if循环
p.push() 进栈
p.pop() 删除栈顶
先进后出用栈
具体代码:
#include<stack>
#include<iostream>
using namespace usd;
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(ch:s){
if(pairs.cout(ch)){ //找到右边符号,下在栈中找是否栈顶为左符号
if(stk.empty()||stk.top!=pairs[ch]){
return false;
}
stk.pop();//否则消掉,出栈
}
else {
stk.push(ch); //左边符号,进栈
}
}
return stk.empty();
};