LeetCode 20.有效的括號(C++)實現
阿新 • • 發佈:2021-01-21
技術標籤: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();
}
};
複雜度分析