給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()" 輸出: true
示例 2:
輸入: "()[]{}" 輸出: true
示例 3:
輸入: "(]" 輸出: false
示例 4:
輸入: "([)]" 輸出: false
示例 5:
輸入: "{[]}" 輸出: true
思路:利用棧,後進先出的特性,依次掃描字符串,一共會出現如下幾種情況:
1. 如果在棧爲空的時候,掃描到了左括號那麼就把這個左括號壓棧,如果在棧爲空的時候,掃描到了右括號,說明不可能匹配。
2. 如果棧中已經有元素,且棧頂元素爲左括號的時候,我們就去判斷來的字符是不是對應的右括號,如果是,說明這個括號配對了,那麼就把這個括號出棧,繼續匹配,如果不是則不匹配。但是如果說來的字符還是左括號的話,那麼就繼續壓棧。
代碼如下:
class Solution {
public:
bool isValid(string s) {
if(s.empty()) return true;
stack<char> parentheses;
for(auto c:s){
if(parentheses.empty() && (']'==c || ')'==c || '}'==c)) return false;
else if(parentheses.empty() && ('['==c || '('==c || '{'==c)) parentheses.push(c);
else if(!parentheses.empty() && ('['==c || '('==c || '{'==c)) parentheses.push(c);
else if(!parentheses.empty() && (']'==c || ')'==c || '}'==c))
{
char top=parentheses.top();
if(']'==c && top=='[') parentheses.pop();
else if('}'==c && top=='{') parentheses.pop();
else if(')'==c && top=='(') parentheses.pop();
else return false;
}
}
if(parentheses.empty()) return true;
else return false;
}
};