题目
请点击
思路
- 用数组cnt[3]表示括号数量。其中下标0对应(),下标1对应[],下标2对应{}。凡遇到左括号相应位置++(例:遇到[,则cnt[1]++)凡遇到右括号相应位置–。
- 用seq表示括号顺序。
- for循环依次判断输入字符串的每个字符。
遇到左括号,则cnt的相应位置++,并且往seq中压入相应的数字(例:(压入0,[压入1)
遇到右括号,判断cnt对应位置是否为零,若为零false,判断seq最后一个元素是否和当前括号相对应(例:)需要判断seq最后一个元素是不是0)若不对应直接false - 弹出seq的最后一个元素,且cnt相应位置 - -
- 判断seq是否为空,若不为空,则括号没匹配完,false
- 否则true
代码
#include<iostream>
#include<vector>
#include<string>
using namespace std;
bool isValid(string s) {
int cnt[3]={0};
vector<int> seq;
for(int i=0;i<s.length();i++){
if(s[i]=='('){
cnt[0]++;
seq.push_back(0);
continue;
}
if(s[i]=='['){
cnt[1]++;
seq.push_back(1);
continue;
}
if(s[i]=='{'){
cnt[2]++;
seq.push_back(2);
continue;
}
if(s[i]==')'){
if(cnt[0]==0||seq.back()!=0) return false;
cnt[0]--;
seq.pop_back();
continue;
}
if(s[i]==']'){
if(cnt[1]==0||seq.back()!=1) return false;
cnt[1]--;
seq.pop_back();
continue;
}
if(s[i]=='}'){
if(cnt[2]==0||seq.back()!=2) return false;
cnt[2]--;
seq.pop_back();
continue;
}
}
if(seq.size()!=0) return false;
return true;
}
int main(){
string s;
cin>>s;
cout<<isValid(s);
return 0;
}