力扣 題目20-- 有效的括號
阿新 • • 發佈:2022-04-08
題目
題解
方法1:刪掉緊矮著的
比如{}{()} 先刪成{()} ->{}->空 遍歷沒有()[]{}這三種情況時 判斷一下是否為空即可
但是這樣時間複雜度過高
方法2:棧
第一個右括號要與它之前的最後一個左括號匹配
第二個右括號要與它之前的倒數第二個左括號匹配
.....
所以我們建立一個棧 把左括號放進去 如果遍歷到右括號 就和棧頂看是否匹配
如果 不匹配直接返回false 如果匹配就把出棧然後繼續遍歷
最後遍歷結束看看 棧是否為空如果為空 則返回true 如果不為空則說明有左括號沒有用完於是返回false
程式碼
方法1:刪掉緊矮著的
#include<iostream> #include<string> using namespace std; class Solution { public: bool isValid(string s) { int correct = 1; //如果s長度小於2 直接返回false if (s.size() < 2) { return false; } //開始迴圈 while (correct) { //如果沒有if情況就退出迴圈 correct = 0;//這裡的迴圈防止重複符合 for (int i = 0; i < s.size(); i++) { //左邊的判斷是確保有( 後面的判斷是確保 ( 後面就是 ) if (s.find("(", i) != -1 && s.find("(", i) + 1 == s.find(")", i)) { int left = s.find("(", i); s.erase(left, 2); correct= 1; break; } else if (s.find("[", i) != -1 && s.find("[", i) + 1 == s.find("]", i)) { int left = s.find("[", i); s.erase(left, 2); correct = 1; break; } else if (s.find("{", i) != -1 && s.find("{", i) + 1 == s.find("}", i)) { int left = s.find("{", i); s.erase(left, 2); correct = 1; break; } } } //看刪除完後是否為空 if (s != "") { return false; } else { return true; } } }; int main() { Solution sol; string s = "){"; bool correct = sol.isValid(s); cout << correct << endl; }
方法2:棧
#include<iostream> #include<string> #include<stack> using namespace std; class Solution { public: bool isValid(string s) { string left = "([{"; string right = ")]}"; stack<char> leftstk; for (int i = 0; i < s.size(); i++) { if (int(left.find(s[i])) != -1) { leftstk.push(s[i]); } else { //如果左棧為空就匹配到了右括號 那麼肯定無法匹配 返回false if (leftstk.empty() || left[int(right.find(s[i]))] != leftstk.top()) { return false; } else { leftstk.pop(); } } } if (leftstk.empty()) { return true; } else { return false; } } }; int main() { Solution sol; string s = ""; bool correct = sol.isValid(s); cout << correct << endl; }