leetcode 20-Valid Parentheses
阿新 • • 發佈:2019-01-30
原題:
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
,
determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are
all valid but "(]"
and "([)]"
are
not.
思路:
這是一個可以用棧(stack)來解決的經典問題,具體可以按照如下幾步來實現:
1. 設輸入的一串括號為s,如果s為空,則返回false。如果s長度為奇數,則必然無法匹配,同樣返回false。
2. 將s的第一個字元壓入棧,開始遍歷s, 並迴圈執行下面的操作。
3. 如果此時棧為空,則分兩種情況:
—— 3.1當前字元屬於左括號,則將其入棧。
—— 3.2當前字元屬於右括號,則s必然無法匹配,直接返回false。
4. 如果此時棧不為空,又分為如下幾種情況:
—— 4.1 如果s的當前字元與棧頂元素可以匹配成一對括號,則將棧頂元素出棧。
—— 4.2 如果不匹配,則分為兩種情況:
———— 4.2.1 如果s當前字元屬於左括號,則將其入棧。
———— 4.2.2 如果s當前字元屬於右括號,則直接返回false。
5. 遍歷完s,如果發現此時棧為空,說明s中的括號完全匹配,返回true,否則返回false。
根據上述思路,可以輕鬆寫出下面的Java程式碼(使用了Java Util中自帶的Stack類)
程式碼(Java):
public class Solution { boolean isMatch(char top, char target) //輔助函式 判斷兩個括號是否匹配 { if(top=='(' && target==')') { return true; } else if(top=='[' && target==']') { return true; } else if(top=='{' && target=='}') { return true; } else { return false; } } boolean isLeft( char target) //輔助函式 判斷括號是否為左括號 { if(target=='('||target=='['||target=='{') { return true; } else { return false; } } boolean isRight( char target) //輔助函式 判斷括號是否為右括號 { if(target==')'||target==']'||target=='}') { return true; } else { return false; } } public boolean isValid(String s) { if(s.equals("")||s==null) { return false; } int length = s.length(); if(length%2==1) { return false; } Stack<Character> temp = new Stack<Character>(); int i = 0; while(i < length) { char target = s.charAt(i); if(temp.isEmpty()) //如果棧為空,並且為左括號,則壓棧,否則必定無法匹配,返回false { if(isLeft(target)) { temp.push(target); } else { return false; } } else { char top = temp.peek(); if(isMatch(top,target)) //如果匹配,則棧頂出棧 { temp.pop(); } else if(isLeft(target)) //如果不匹配,當前括號為左括號則壓棧 { temp.push(target); } else //如果不匹配,當前括號為右括號則返回false { return false; } } ++i; } if(temp.isEmpty()) { return true; } return false; } }