1. 程式人生 > 其它 >03 有效的括號(leecode 20)

03 有效的括號(leecode 20)

技術標籤:# 資料結構與演算法05-棧與佇列資料結構leetcode演算法

1 問題

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

有效字串需滿足:

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

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

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

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

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

示例 5:
輸入: “{[]}”
輸出: true

2 解法

這裡有三種不匹配的情況,
(1)第一種情況,字串裡左方向的括號多餘了 ,所以不匹配。

在這裡插入圖片描述
(2)第二種情況,括號沒有多餘,但是 括號的型別沒有匹配上。
在這裡插入圖片描述
(3)第三種情況,字串裡右方向的括號多餘了,所以不匹配。
在這裡插入圖片描述
第一種情況:已經遍歷完了字串,但是棧不為空,說明有相應的左括號沒有右括號來匹配,所以return false

第二種情況:遍歷字串匹配的過程中,發現棧裡沒有要匹配的字元。所以return false

第三種情況:遍歷字串匹配的過程中,棧已經為空了,沒有匹配的字元了,說明右括號沒有找到對應的左括號return false

那麼什麼時候說明左括號和右括號全都匹配了呢,就是字串遍歷完之後,棧是空的,就說明全都匹配了。

class Solution {
public:
    bool
isValid(string s) { stack<int> st; //遍歷字串 for(int i = 0; i < s.size(); i++) { //棧中存放與(,[,{匹配的字元 if(s[i] == '(') st.push(')'); else if(s[i] == '[') st.push(']'); else if(s[i] == '{') st.
push('}'); //第三種情況:遍歷字串匹配的過程中,棧已經為空了,沒有匹配的字元了, 說明右括號沒有找到對應的左括號 //第二種情況:遍歷字串匹配的過程中,發現棧裡沒有我們要匹配的字元。 else if(st.empty() || st.top() != s[i]) return false; else //st.top() == s[i],彈出元素 st.pop(); } //第一種情況,字串已經遍歷完,棧不為空,說明左括號沒有找到對應的右括號 return st.empty(); } };