LeetCode第20題,這題比較簡單,匹配括號. java
這是棧的典型應用,括號匹配,固然不須要直接使用棧,使用一個StringBuilder便可:git
if(s.isEmpty()) return true; char a = s.charAt(0); if (a != '(' && a != '[' && a != '{') return false; StringBuilder t = new StringBuilder(); int len = -1; for(char c:s.toCharArray()) { if(c == '(' || c == '[' || c == '{') { t.append(c); ++len; } else { if(len == -1) return false; char cc = t.charAt(len); if( (c == ')' && cc != '(') || (c == ']' && cc != '[') || (c == '}' && cc != '{') ) return false; t.deleteCharAt(len--); } } return len == -1;
首先判斷是否爲空,再判斷第一個字符,而後進入逐個循環判斷,若表示左邊的括號則append,若表示右邊的括號首先判斷len,而後取出len處字符進行判斷是否匹配,不匹配直接返回false,匹配的話則刪除這個字符.最後根據len是否爲-1返回最終結果. github
其實就是簡化一下代碼,直接開闢一個大的空間,不須要進行append與delete,只需移動棧頂指針.棧頂指針從1開始,若從0開始的話對於"]"這種狀況會報下標越界錯誤,壓棧就是++p,壓入字符,出棧直接- - p,而後判斷是否匹配便可.app
char[] t = new char[s.length() + 1]; int p = 1; for (char c : s.toCharArray()) { if (c == '(' || c == '[' || c == '{') t[p++] = c; else { --p; if ((c == ')' && t[p] != '(') || (c == ']' && t[p] != '[') || (c == '}' && t[p] != '{')) return false; } } return p == 1;
github優化
碼雲ui