給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認為是有效字符串。
自己算法思路:首先判斷字符串是否為空,如果為空,直接認為是有效字符串,返回true;然后利用stack的數據結構來解題,逐個判斷字符串,如果是左括號,就打入棧中,如果是右括號,判斷棧是否為空,為空則返回false,再判斷棧頂是不是對應的左括號,如果是,則將棧頂的元素出棧,如果不是,則返回false。
bool isValid(string s) { if(s.empty()) return true; stack<char> sta; for(int i=0;i<s.size();i++) { if(s[i]=='(' || s[i]=='[' || s[i]=='{') { sta.push(s[i]); } else if(sta.empty()) { return false; } else if((s[i] == ')' && sta.top()=='(') ||(s[i] == ']' && sta.top()=='[')||(s[i] == '}' && sta.top()=='{')) { sta.pop(); } else return false; } if(sta.empty()) return true; else return false; }
算法缺陷:因為每次只打入左括號,如果第一個就是右括號,則要先判斷棧是否為空,否則訪問棧頂元素則會出錯。這樣判斷情況太多,不夠簡潔。
bool isValid(string s) { stack<char> result; int n=s.size(); if(n==0) return true; for(int i=0;i<n;i++) { if(result.empty()) result.push(s[i]); else if(result.top()=='('&&s[i]==')'|| result.top()=='['&&s[i]==']'|| result.top()=='{'&&s[i]=='}') result.pop(); else result.push(s[i]); } return result.empty(); }
只要棧中的元素為空,就入棧,而且棧頂和目前的元素無法配對的時候,同樣打入棧中,這樣避免了一開始就是右括號,不入棧,接下來要訪問棧頂的尷尬,其余思路和上面的一樣,最后只需要判斷棧中是不是為空就好了。