03 有效的括號(leecode 20)
阿新 • • 發佈:2021-02-17
技術標籤:# 資料結構與演算法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();
}
};