LeetCode第[20]題(Java):Valid Parentheses

來源:互聯網
上載者:User

標籤:false   char   AC   ali   leetcode   []   字元   if else   檢查   

題目:有效括弧序列

難度:Easy

題目內容

Given a string containing just the characters ‘(‘‘)‘‘{‘‘}‘‘[‘ and ‘]‘, determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

翻譯:給定一個字串,只包含字元‘(‘,‘)‘,‘{ ‘,‘}‘,‘[‘和‘]‘,確定輸入字串是否有效。

輸入字串是有效:

  開括弧必須以相同類型的括弧關閉。

  開啟括弧必須以正確的順序關閉。

注意,Null 字元串也被認為是有效。

Example 1:

Input: "()"Output: true

Example 2:

Input: "()[]{}"Output: true

Example 3:

Input: "(]"Output: false

Example 4:

Input: "([)]"Output: false

Example 5:

Input: "{[]}"Output: true

 

我的思路:資料結構——括弧問題是經典的棧問題。

          【因為這有三種括弧,三個之間的嵌套比較複雜,所以不能簡單地使用整形int作為判斷(左括弧++,右括弧--),例如“([)]”這要是使用int那麼就會判斷正確。】

     演算法——利用一個棧,如果是左括弧則直接放入,如果是右括弧,pop棧頂看是否為對應左括弧,否則return false;最後檢查棧是否為空白。

My Code

 1     public boolean isValid(String s) { 2         char[] sc = s.toCharArray(); 3         Stack<Character> stack = new Stack<Character>(); 4         for(int i = 0; i<s.length(); i++) { 5             switch (sc[i]) { 6                 case ‘)‘: 7                     if (stack.empty() || stack.pop() != ‘(‘) 8                         return false; 9                     break;10                 case ‘}‘:11                     if (stack.empty() || stack.pop() != ‘{‘)12                         return false;13                     break;14                 case ‘]‘:15                     if (stack.empty() || stack.pop() != ‘[‘)16                         return false;17                     break;18                 default:19                     stack.push(sc[i]);20             }21         }22         return stack.empty();23     }

我的演算法複雜度:時間——O(N)  空間——O(N)

編碼過程出現問題

1、一開始用的if else 比較繁瑣,後來改的switch;  對於先peek判斷再pop的,可以直接最佳化為判斷相反條件的pop

例如:

if (!stack.empty() && stack.peek() == ‘[‘)    stack.pop();else    return false;break;

可以最佳化成:

if (stack.empty() || stack.pop() != ‘[‘)    return false;break;

【其實沒什麼卵用。。】

2、pop()之前應該要判斷棧是否為空白,如果為空白,也應該return false;

3、其實最開始可以加一個判斷,如果s的長度為單數,則直接返回false。

 

參考答案代碼

 1     public boolean isValid(String s) { 2         if ((s.length() & 1) == 1) 3             return false; 4         Stack<Character> stack = new Stack<Character>(); 5         for (char c : s.toCharArray()) { 6             if (c == ‘(‘) 7                 stack.push(‘)‘); 8             else if (c == ‘{‘) 9                 stack.push(‘}‘);10             else if (c == ‘[‘)11                 stack.push(‘]‘);12             else if (stack.isEmpty() || stack.pop() != c)13                 return false;14         }15         return stack.isEmpty();16     }

答案演算法複雜度:時間——O(N)  空間——O(N)

答案思想:其實思想和我的那個差不多【強行不要臉】,不過這個方法利用了反向思維:如果當前是左括弧,則放入對應的右括弧,如果是右括弧則pop棧頂是否是“自己”,否則return false。這樣一來就減少了代碼裡對是否是對應左括弧的判斷。不過兩者演算法複雜度和意義上都一樣,一個可讀性好些,一個更加簡練一些。

 

LeetCode第[20]題(Java):Valid Parentheses

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.