【演算法】LeetCode演算法題-Valid Parentheses
阿新 • • 發佈:2018-12-16
這是悅樂書的第147次更新,第149篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第6題(順位題號是20),給定一個只包含字元’(’,’)’,’{’,’}’,’[‘和’]'的字串,確定輸入字串是否有效。輸入的字串必須使用相同型別的括號關閉左括號,並且以正確的順序關閉左括號。如果輸入空串,返回true。例如:
輸入: “()” 輸出: true
輸入: “()[]{}” 輸出: true
輸入: “([)]”
輸出: false
輸入: “{[]}” 輸出: true
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
利用字串的替換方法。左括號和右括號必須一起出現,無論其裡層還是外層有多少層,如"{()}","()“的外面有一層”{}",或者"{}“的裡層是”()",將裡面的"()“替換為空串,剩下”{}"再替換為空串,最後為空串,返回true。
public boolean isValid(String s) { boolean flag = false; if (s.isEmpty()) { return true; } String s2 = s; for (int i=0; i<s.length()/2; i++) { s2 = s2.replaceAll("\\(\\)", ""); s2 = s2.replaceAll("\\{\\}", ""); s2 = s2.replaceAll("\\[\\]", ""); if (s2.length() == 0) { return true; } } return flag; }
03 第二種解法
利用棧後進先出的特點。將左括號開頭的字元依次存入棧中,遇到右括號時,從棧中取出進棧的資料,如果是一對左右括號,繼續迴圈,反之返回false。 字串"{()}",將其拆分為四個字元’{’,’(’,’)’,’}’,第1次迴圈進棧字元是’{’,第2次迴圈進棧字元是’(’,第三次迴圈遇到右括號’)’,從棧中取出資料’(’,判斷是否為一對。依次往後迴圈判斷。
public boolean isValid2(String s) { Stack<Character> pare_stack = new Stack<Character>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch(c) { case '(': case '[': case '{': pare_stack.push(c); break; case ')' : if (pare_stack.isEmpty()) { return false; } else { if (pare_stack.pop() == '(') { break; } else { return false; } } case ']' : if (pare_stack.isEmpty()) { return false; } else { if (pare_stack.pop() == '[') { break; } else { return false; } } case '}' : if (pare_stack.isEmpty()) { return false; } else { if (pare_stack.pop() == '{') { break; } else { return false; } } } } return pare_stack.isEmpty(); }
04 第三種解法
利用陣列。遇到左括號,將右括號放進陣列;遇到右括號,取陣列最後一位匹配,匹配上則刪除陣列最後一位元素繼續迴圈,匹配不上則返回false。
public boolean isValid3(String s) {
List<String> nextClose = new ArrayList<>();
if (s.length() == 0) {
return true;
}
if (")]}".indexOf(s.charAt(0)) != -1) {
return false;
}
for (int i = 0; i < s.length(); i++) {
try {
switch (s.charAt(i)) {
case '(':
nextClose.add(")");
break;
case '[':
nextClose.add("]");
break;
case '{':
nextClose.add("}");
break;
case ')':
if (nextClose.get(nextClose.size() - 1) != ")") {
return false;
} else {
nextClose.remove(nextClose.size() - 1);
}
break;
case ']':
if (nextClose.get(nextClose.size() - 1) != "]") {
return false;
} else {
nextClose.remove(nextClose.size() - 1);
}
break;
case '}':
if (nextClose.get(nextClose.size() - 1) != "}") {
return false;
} else {
nextClose.remove(nextClose.size() - 1);
}
break;
}
} catch (ArrayIndexOutOfBoundsException e) {
return false;
}
}
return nextClose.size() == 0;
}
05 小結
此題解法遠不止上面這三種,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!
本文首發於我的個人公眾號:悅樂書,轉載請註明出處!