有效的括號序列(LintCode)
阿新 • • 發佈:2018-12-26
題目來源:LintCode
原題地址:http://www.lintcode.com/zh-cn/problem/valid-parentheses/
題目:
容易 思路分析: 首先我們需要知道,此題只是讓我們判斷括號序列是否合法,不是表示式是否合法,因此我們就假定只有括號,或者說我們只考慮括號,不考慮其他的字元。
其次,我們知道括號是否有效:
第一,括號要成對出現,例如出現左圓括號('(')n次,則右圓括號(')')也必須出現n次,對於方括號和花括號也是一樣的;
第二,括號可以巢狀,但是從裡到外一定是滿足可以成對抵消的,而不能夠是錯開的,這個從樣例就可以看出來。
那麼我的思路就是借用棧這個資料結構來解此題。
1. 遇到左括號,全部壓入棧中;
2. 遇到右括號,判斷棧頂的元素是否是相對應的左括號,若是則彈出棧頂元素,若不是則返回false,若棧為空,也返回false;
實現程式碼:
程式碼說明:
這裡需要說明的是:
我這裡多寫了一個whatParent函式,此函式用來判斷當前字元具體是哪一個括號,返回是一個數字。
這樣,對於成對括號而言,其和為0,給我判斷是否是成對括號這個問題帶來了極大的方便。
給定一個字串所表示的括號序列,包含以下字元:'(', ')'
,'{'
,'}'
,'['
and']'
,
判定是否是有效的括號序列。
括號必須依照"()"
順序表示,"()[]{}"
是有效的括號,但"([)]"
則是無效的括號。
O(n)的時間,n為括號的個數
難度級別:容易 思路分析: 首先我們需要知道,此題只是讓我們判斷括號序列是否合法,不是表示式是否合法,因此我們就假定只有括號,或者說我們只考慮括號,不考慮其他的字元。
其次,我們知道括號是否有效:
第一,括號要成對出現,例如出現左圓括號('(')n次,則右圓括號(')')也必須出現n次,對於方括號和花括號也是一樣的;
第二,括號可以巢狀,但是從裡到外一定是滿足可以成對抵消的,而不能夠是錯開的,這個從樣例就可以看出來。
那麼我的思路就是借用棧這個資料結構來解此題。
1. 遇到左括號,全部壓入棧中;
2. 遇到右括號,判斷棧頂的元素是否是相對應的左括號,若是則彈出棧頂元素,若不是則返回false,若棧為空,也返回false;
#include <iostream> #include <string> #include <stack> using namespace std; class Solution { public: /** * @param s A string * @return whether the string is a valid parentheses */ bool isValidParentheses(string& s) { if (s.empty()) return false; stack<char> chStack; for (int i = 0; i < s.size(); i++) { if (whatParent(s[i]) < 0) { chStack.push(s[i]); } else if (whatParent(s[i]) > 0) { if (chStack.empty()) { return false; } if (whatParent(chStack.top()) + whatParent(s[i]) == 0) { chStack.pop(); } else { return false; } } } if (chStack.empty()) { return true; } return false; } int whatParent(char ch) { switch (ch) { case '(': return -1; case ')': return 1; case '[': return -2; case ']': return 2; case '{': return -3; case '}': return 3; default: break; } return 0; } };
程式碼說明:
這裡需要說明的是:
我這裡多寫了一個whatParent函式,此函式用來判斷當前字元具體是哪一個括號,返回是一個數字。
這樣,對於成對括號而言,其和為0,給我判斷是否是成對括號這個問題帶來了極大的方便。