官方答案
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();
}
};
思路:
首先判斷字符串長度明也,如果是奇數(shù)肯定不匹配直接返回false;
利用unordered_map(見001)建立括號對;
用stack建立棧冕屯,需要注意的是這里的棧用char實現(xiàn);
for語言遍歷字符串中的字符囱桨,對于每個字符舍肠,當棧空或棧頂非對應括號則返回false;否則則壓入棧(也就是說遇見所有左括號壓棧紧索,右括號判斷)晚缩;
讀取完字符串若棧空則返回true,否則返回false趟据。
1.unordered_map count函數(shù)
https://vimsky.com/examples/usage/unordered_map-count-in-c.html
由于unordered_map不允許存儲具有重復鍵的元素,因此count()函數(shù)本質(zhì)上檢查unordered_map中是否存在具有給定鍵的元素术健。
2.for語句遍歷
https://www.cnblogs.com/132818Creator/p/11208541.html
自己寫的答案汹碱,用的switch,需要注意的是遇見右括號時先要判斷棧是否為空荞估,否則程序運行錯誤咳促。
class Solution {
public:
bool isValid(string s) {
if(s.size()%2==1)
return false;
stack<char> stk;
for(char c:s){
switch(c){
case '(':
stk.push(c);
break;
case '[':
stk.push(c);
break;
case '{':
stk.push(c);
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;
}
}
return stk.empty();
}
};