1. 程式人生 > >leetcode-java-20-有效的括號(valid parentheses)-java

leetcode-java-20-有效的括號(valid parentheses)-java

題目及測試

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(); } }

在這裡插入圖片描述