Leetcode 有效的括號 ( 最詳細的解法!!!)

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。

有效字符串需滿足:

左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。

示例 1:

輸入: “()”
輸出: true
示例 2:

輸入: “()[]{}”
輸出: true
示例 3:

輸入: “(]”
輸出: false
示例 4:

輸入: “([)]”
輸出: false
示例 5:

輸入: “{[]}”
輸出: true

解題思路:遍歷題給字符串,新建一個棧或者vector,如果是左括號的話,一律壓入,如果是右括號,則看前一個被壓入的是不是與之匹配的左括號,這需要分類討論,如果不是,則返回false,否則就將左括號刪除,繼續遍歷下一個元素、以此類推。直到新建的棧或者vector中沒有元素,返回true,否則返回false。

代碼1如下:(使用vector)

class Solution {
public:
    bool isValid(string s) {
        int len = s.length();
        vector<char> stack;
        for (int i = 0; i < len; i++) {
            // 左括號壓棧
            if (s[i] == '(' || s[i] == '[' || s[i] == '{') 
                stack.push_back(s[i]);
            else {
                // 右括號出棧
                if (stack.empty()) 
                    return false;
                char top = stack[stack.size() - 1];
                if (s[i] == ')' && top != '(')
                    return false;
                if (s[i] == ']' && top != '[') 
                    return false;
                if (s[i] == '}' && top != '{') 
                    return false;
                stack.pop_back();
            }
        }
        // 棧中無多餘左括號
        if (stack.size() > 0) 
            return false;
        return true;
    }
};

代碼2如下:(使用棧)

class Solution {
public:
    bool isValid(string s) {
        int len = s.length();
        stack<char> temp;
        for (int i = 0; i < len; i++) {
            // 左括號壓棧
            if (s[i] == '(' || s[i] == '[' || s[i] == '{') 
                temp.push(s[i]);
            else {
                // 右括號出棧
                if (temp.empty()) 
                    return false;
                char top = temp.top();
                if (s[i] == ')' && top != '(')
                    return false;
                if (s[i] == ']' && top != '[') 
                    return false;
                if (s[i] == '}' && top != '{') 
                    return false;
                temp.pop();
            }
        }
        // 棧中無多餘左括號
        if (!temp.empty()) 
            return false;
        return true;
    }
};

解題思路2:在思路一的基礎上,可以不需要分類討論,可以在最開始的時候搞一個map,這樣每次都是右括號的情況就可以從map中查了,而不用其他多餘判斷。其他的思路大致一樣。
代碼如下:

class Solution {
public:
    bool isValid(string s) {
        map<char, char> kuohao;
        kuohao['('] = ')';
        kuohao['{'] = '}';
        kuohao['['] = ']';

        stack<char> temp;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
                temp.push(s[i]);
            } 
            else if (temp.empty() || kuohao[temp.top()] != s[i]) {
                return false;
            } 
            else {
                temp.pop();
            }              
        }
        return temp.empty();
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章