leetcode-java-20-有效的括號(valid parentheses)-java
阿新 • • 發佈:2018-10-31
題目及測試
package pid020; /* 有效的括號 給定一個只包括 '(',')','{','}','[',']' 的字串,判斷字串是否有效。 有效字串需滿足: 左括號必須用相同型別的右括號閉合。 左括號必須以正確的順序閉合。 注意空字串可被認為是有效字串。 示例 1: 輸入: "()" 輸出: true 示例 2: 輸入: "()[]{}" 輸出: true 示例 3: 輸入: "(]" 輸出: false 示例 4: 輸入: "([)]" 輸出: false 示例 5: 輸入: "{[]}" 輸出: true }*/ public class main { public static void main(String[] args) { String[] testTable = {"()","()[]{}","(]","([)]","{[]}"}; for (String ito : testTable) { test(ito); } } private static void test(String ito) { Solution solution = new Solution(); boolean rtn; long begin = System.currentTimeMillis(); System.out.print(ito+" "); rtn = solution.isValid(ito);//執行程式 long end = System.currentTimeMillis(); System.out.println("rtn=" + rtn); System.out.println(); System.out.println("耗時:" + (end - begin) + "ms"); System.out.println("-------------------"); } }
解法1(成功,13ms,較慢)
用棧,如果是前面的括號則直接入棧,如果是後面的先檢查棧是否為空,然後看pop出的括號是否為對應的前括號,最後遍歷完檢查棧是否為空,若不為空,這說明有前擴或未對應
package pid020; import java.util.Stack; public class Solution { public boolean isValid(String s) { Stack<Character> stack=new Stack<>(); Character now; Character prev; int length=s.length(); for(int i=0;i<length;i++){ now=s.charAt(i); if(now=='('||now=='['||now=='{'){ stack.push(now); } else{ if(stack.isEmpty()){ return false; }else{ prev=stack.pop(); } if(now==')'){ if(prev!='('){ return false; } } else if(now==']'){ if(prev!='['){ return false; } } else if(now=='}'){ if(prev!='{'){ return false; } } } } if(stack.isEmpty()){ return true; } else{ return false; } } }
解法2(別人的)
內容一樣,用switch和各種方法簡化了流程
public boolean isValid(String s) { Stack<Character> stack = new Stack<Character>(); for (int i = 0; i < s.length(); ++ i) { switch (s.charAt(i)) { case ')': if (stack.isEmpty() || !stack.pop().equals('(')) return false; break; case ']': if (stack.isEmpty() || !stack.pop().equals('[')) return false; break; case '}': if (stack.isEmpty() || !stack.pop().equals('{')) return false; break; default: stack.push(s.charAt(i)); break; } } return stack.isEmpty(); }
解法3(別人的)
用map的方式進行簡化和對應
public class Solution { public boolean isValid(String s) { Map<Character,Character> map = new HashMap<>(); map.put('(', ')'); map.put('[', ']'); map.put('{', '}'); Stack<Character> stack = new Stack<>(); for(int i=0;i<s.length();i++) { char curr = s.charAt(i); if(map.keySet().contains(curr)) { stack.push(curr); } else { if(!stack.empty() && map.get(stack.peek()) == curr) { stack.pop(); } else { return false; } } } return stack.empty(); } }