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.
以上是题目要求,一开始理解错题意,以为两个匹配括号必须相邻,这有何难??但是后来掐指一算发现事情并不简单,于是自然而然地想到了用栈来解决问题,顺便学习一下在Java中如何使用Stack类来解决栈的相关问题。
思路很简单,遇到( [ {后就入栈,遇到] ) }就匹配栈顶字符,如果匹配成功则出栈,如果匹配不成功或栈为空则返回false。
代码:
package Q20ValidParentheses;
import java.util.Scanner;
import java.util.Stack;
/**
* @author 单继重
* @since 2017/11/13 19:57
*/
public class Solution {
public static boolean isValid(String s) {
//题意理解错误
// String[] strings = s.split("");
// if (strings.length % 2 == 1) {
// return false;
// }
// for (int i = 0 ; i < strings.length - 1 ; i += 2) {
// switch (strings[i]) {
// case "(":
// if (!strings[i + 1].equals(")")) {
// return false;
// }
// break;
// case "{":
// if (!strings[i + 1].equals("}")) {
// return false;
// }
// break;
// case "[":
// if (!strings[i + 1].equals("]")) {
// return false;
// }
// break;
// default:
// return false;
// }
// }
// return true;
Stack stringStack = new Stack<>();
String[] strings = s.split("");
if (strings.length % 2 == 1) {
return false;
}
for (String string : strings) {
switch (string) {
case "(":
stringStack.push("(");
break;
case "{":
stringStack.push("{");
break;
case "[":
stringStack.push("[");
break;
case ")":
if (stringStack.isEmpty()) {
return false;
} else if (stringStack.peek().equals("(")) {
stringStack.pop();
} else {
return false;
}
break;
case "]":
if (stringStack.isEmpty()) {
return false;
} else if (stringStack.peek().equals("[")) {
stringStack.pop();
} else {
return false;
}
break;
case "}":
if (stringStack.isEmpty()) {
return false;
} else if (stringStack.peek().equals("{")) {
stringStack.pop();
} else {
return false;
}
break;
default:
return false;
}
}
return stringStack.isEmpty();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.nextLine();
System.out.println(isValid(s));
}
}
}
但是提交之后虽然AC成功了但是发现运行速度很慢,然后就看到了一个让我感觉自己很渺小的一个做法,大概思路还是使用栈,但是遍历到 ( 时,入栈 ) ,同理其他两个字符,然后使用pop()方法匹配字符,若出栈字符和遍历到的字符equal,则继续遍历,若不符,则返回false,代码量超级小并且显而易见的运行速度快,代码就不贴了,甘拜下风。