括號匹配,算是字符串處理中的一個問題,比較常見,這里就總結一下大體的思路,附贈我的個人代碼。
大體思路:數據結構選用棧,讀到左括號時入棧,讀到右括號時判斷是否匹配,匹配則左括號出棧,非括號字符則繼續往下讀
代碼如下:
#include <iostream> #include <cstring> #include <string> #include <stack> using namespace std; class Solution { public: bool isValid(string s) { stack<char> str; for(int i=0;i<s.length();i++){ switch(s[i]) { case '{': case '[': case '(':str.push(s[i]);break; case '}': case ']': case ')':char temp=s[i]; if(str.empty()) return false; else if((temp=='}'&&str.top()=='{')||(temp==']'&&str.top()=='[')||(temp==')'&&str.top()=='(')) str.pop(); else{ return false; } } } if(!str.empty()){ return false; } else return true; } }; int main() { Solution s1; cout<<s1.isValid("]")<<endl; }
給出另一種寫法,思路類似,只是代碼形式不同
bool isValid(string s) { vector<char> vc; map<char, char> em; em['('] = ')'; em['{'] = '}'; em['['] = ']'; for (int i = 0; i < s.length(); ++i) { if (s[i] == '(' || s[i] == '{' || s[i] == '[') { vc.push_back(em[s[i]]); } else if (vc.empty() || vc.back() != s[i]) { return false; } else { vc.pop_back(); } } return vc.empty() ? true : false; }