LeetCode刷題系列20

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

有效字符串需滿足:

    左括號必須用相同類型的右括號閉合。
    左括號必須以正確的順序閉合。

注意空字符串可被認爲是有效字符串。

示例 1:

輸入: "()"
輸出: true

示例 2:

輸入: "()[]{}"
輸出: true

示例 3:

輸入: "(]"
輸出: false

示例 4:

輸入: "([)]"
輸出: false

示例 5:

輸入: "{[]}"
輸出: true

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
  • C++編程實現:

算法:

    (1)初始化棧 S。
    (2)一次處理表達式的每個括號。
    (3)如果遇到開括號,我們只需將其推到棧上即可。這意味着我們將稍後處理它,讓我們簡單地轉到前面的 子表達式。
    (4)如果我們遇到一個閉括號,那麼我們檢查棧頂的元素。如果棧頂的元素是一個 相同類型的 左括號,那麼我們將它從棧中彈出並繼續處理。否則,這意味着表達式無效。
    (5)如果到最後我們剩下的棧中仍然有元素,那麼這意味着表達式無效。

作者:LeetCode
鏈接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

方法一:

class Solution {
public:
    bool isValid(string s) {
        if (s.empty()) {
            return true;
        }
        if (s.size()%2)
            return false;
        map<char, char> sMap = {{')', '('},
                                {'}', '{'},
                                {']', '['}};
        stack<char> st;
        for (int i = 0; i < s.size(); i++) {
            if (st.empty()) {
                st.push(s[i]);
            }
            else
            {
                if (sMap[s[i]] != st.top())
                {
                    st.push(s[i]);
                }
                else
                {
                    st.pop();
                }
            }
            if (st.size() > s.size() / 2) {
                return false;
            }
        }
        return st.empty();
    }
};

方法二:

class Solution {
public:
    int get_pos(vector<char> svec, char str)
    {
        for(int i=0; i<svec.size(); i++)
        {
            if(str == svec[i])
                return i;
        }
        return 1000;
    }
    
    bool isValid(string s) {
        vector<char> s1 = {'(', '[', '{'};
        vector<char> s2 = {')', ']', '}'};
        if (count(s2.begin(), s2.end(), s[0]) != 0)
            return false;
        if (s.size() % 2 != 0)
            return false;
        stack<char> res;
        int start = 0;
        char top;
        while(start < s.size())
        {
            if (count(s1.begin(), s1.end(), s[start]) != 0)
            {
                res.push(s[start]);
                start++;
                continue;
            }
            else if (count(s2.begin(), s2.end(), s[start]) != 0)
            {
                if (res.empty())
                    return false;
                top = res.top();
                if (get_pos(s1, top) != get_pos(s2, s[start]))
                    return false;
                else
                {
                    res.pop();
                    start++;
                }
            }
        }
        if (res.empty())
            return true;
        else
            return false;
    }
};


作者:su-ge
鏈接:https://leetcode-cn.com/problems/valid-parentheses/solution/c-zhan-de-jian-dan-shi-xian-yi-dong-by-su-ge/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章