1. 程式人生 > 其它 >力扣 題目20-- 有效的括號

力扣 題目20-- 有效的括號

題目


題解


 

方法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;

}