1. 程式人生 > 其它 >LeetCode 20.有效的括號(C++)實現

LeetCode 20.有效的括號(C++)實現

技術標籤:LeetCode刷題c++leetcode資料結構

題目描述:

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

有效字串需滿足:

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

示例 1:

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

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

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

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

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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/valid-parentheses

解題思路:

方法一:棧

判斷括號的有效性可以使用「棧」這一資料結構來解決。

我們對給定的字串進行遍歷,當我們遇到一個左括號時,我們會期望在後續的遍歷中,有一個相同型別的右括號將其閉合。由於後遇到的左括號要先閉合,因此我們可以將這個左括號放入棧頂。

當我們遇到一個右括號時,我們需要將一個相同型別的左括號閉合。此時,我們可以取出棧頂的左括號並判斷它們是否是相同型別的括號。如果不是相同的型別,或者棧中並沒有左括號,那麼字串 無效,返回False。為了快速判斷括號的型別,我們可以使用雜湊對映(HashMap)儲存每一種括號。雜湊對映的鍵為右括號,值為相同型別的左括號。

在遍歷結束後,如果棧中沒有左括號,說明我們將字串 ss 中的所有左括號閉合,返回True,否則返回 False。

注意到有效字串的長度一定為偶數,因此如果字串的長度為奇數,我們可以直接返回 False,省去後續的遍歷判斷過程。

學習產出:

class Solution {
public:
    bool isValid(string s) {
    //計算字串長度
        int n = s.size();
        //長度為奇數 返回false
        if (n % 2 == 1) {
            return false;
        }
		//unordered_map<const Key, T> map;
		//主要使用的也是模板的前2個引數<鍵,值>(需要更多的介紹可以點選這裡)
unordered_map<char, char> pairs = { {')', '('}, {']', '['}, {'}', '{'} }; //新建棧 stack<char> stk; for (char ch: s) { //判斷是否為‘)’ ‘]’ '}' if (pairs.count(ch)) { if (stk.empty() || stk.top() != pairs[ch]) { return false; } stk.pop(); } else { stk.push(ch); } } //返回false return stk.empty(); } };

複雜度分析
在這裡插入圖片描述