標籤: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:
- Open brackets must be closed by the same type of brackets.
- 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