給定一個只包括 `(`
,`)`
,`{`
,`}`
,`[`
,`]`
的字串,判斷字串是否有效。
有效字串需滿足:
- 左括號必須用相同型別的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}" 輸出: true
=============================================================
基本思路其實還是比較簡單的, 我剛剛開始想得就十分的複雜。。。
首先分析一下:
- 左括號必須有右括號匹配,並且與其匹配的括號是同型別的;
- 不同型別的括號不能穿插含括,如例4,存線上性規則。
毫無疑問要使用棧了(雖然我看到了棧的標籤了ehahaha…)
由上面的特性就可以得到基本思路:
碰到左括號則壓入棧中;
碰到右括號,則與棧頂進行匹配,如果屬於同型別,則把棧頂彈出(注意監測空棧),如果不同,return false;
最後監測空棧,不是空棧(有括號剩餘),return false;
是空棧,return ture;
下面是AC程式碼:
1 class Solution { 2 public: 3 bool isValid(string s) { 4 stack <char> mark; 5 for(char temp :s){ 6 if (temp==`(`) 7 mark.push(`)`); 8 else if(temp==`[`) 9 mark.push(`]`); 10 else if(temp==`{`) 11 mark.push(`}`); 12 else{ 13 if (mark.empty()||temp!=mark.top()) 14 return false; 15 else mark.pop(); 16 } 17 } 18 return mark.empty(); 19 } 20 };