1. 程式人生 > >Leetcode(20)有效的括號

Leetcode(20)有效的括號

題目描述
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true

解題思路
說實話看到這個 我第一印象是利用堆疊的知識,可以將括號分為兩類,一類是左括號,一類是右括號,使括號字串依次入棧,最開始肯定是左括號,然後依次入棧,如果是右括號的話,檢查堆疊裡面前一個是否匹配,如果匹配的話,將前一個出棧,檢查下一個,直到讀取完最後的一個,檢查堆疊的大小,如果為零,證明全部匹配,如果不為零,證明不匹配。

程式碼如下

class Solution {
public:
    bool isValid(string s) {
        int tagVal[256];
        tagVal['('] = 1;
        tagVal['['] = 2;
        tagVal['{'] = 3;
        tagVal[')'] = 4;
        tagVal[']'] = 5;
        tagVal['}'] = 6;
        int num = s.size();
        if (s.size() % 2 != 0) return false;
        int i = 0;
        for (; i<s.size(); i++)
        {
            if (tagVal[s[i]] >= 4 && tagVal[s[i]] <= 6 && tagVal[s[i]] == tagVal[s[i - 1]]+3)
            {
                s.erase(i,1);
                s.erase(i - 1,1);
                //cout << s << endl;
                i-=2;
            }
        }
        //cout << s << endl;
        if (s == "")
            return true;
        else
            return false;
    }
};

看了一下網上的各種解法,發現思路是基本一樣的,都是將其看成堆疊的形式進行求解的