Leetcode 20 有效的括號valid-parentheses(棧)

opticor------發表於2018-09-15

給定一個只包括 `(``)``{``}``[``]` 的字串,判斷字串是否有效。

有效字串需滿足:

  1. 左括號必須用相同型別的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

示例 1:

輸入: "()"
輸出: true

示例 2:

輸入: "()[]{}"
輸出: true

示例 3:

輸入: "(]"
輸出: false

示例 4:

輸入: "([)]"
輸出: false

示例 5:

輸入: "{[]}"
輸出: true

=============================================================
基本思路其實還是比較簡單的, 我剛剛開始想得就十分的複雜。。。
首先分析一下:
  1. 左括號必須有右括號匹配,並且與其匹配的括號是同型別的;
  2. 不同型別的括號不能穿插含括,如例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 };

 


 
 

相關文章