给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
思路
解法1-栈
执行用时 :3 ms, 在所有 Java 提交中击败了59.96%的用户
内存消耗 :34.3 MB, 在所有 Java 提交中击败了50.94%的用户
class Solution {
public boolean isValid(String s) {
if (s.isEmpty()){
return true;
}
char[] arr = s.toCharArray();
Stack<Character> stack =new Stack<>();
for(int i=0; i<arr.length; i++){
if(stack.isEmpty()){
stack.push(arr[i]);
}else if (judge(stack.peek(), arr[i])){
stack.pop();
}else{
stack.push(arr[i]);
}
}
return stack.isEmpty();
}
boolean judge(char a, char b){
return (a=='(' && b==')') || (a=='[' && b==']') || (a=='{' && b=='}');
}
}
解法2-same 9 years education, why are u outstanding ?
https://leetcode.com/problems/valid-parentheses/discuss/9178/Short-java-solution
执行用时 :2 ms, 在所有 Java 提交中击败了93.84%的用户
内存消耗 :34.1 MB, 在所有 Java 提交中击败了75.38%的用户
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}
解法3-思路清奇
(1)效率较低。另外注意String
字符串的final
特性,得加上s = s.replace("()", "");
。
执行用时 :105 ms, 在所有 Java 提交中击败了5.01%的用户
内存消耗 :37.5 MB, 在所有 Java 提交中击败了5.00%的用户
class Solution {
public boolean isValid(String s) {
while (s.contains("()") || s.contains("[]") || s.contains("{}")){
s = s.replace("()", "");
s = s.replace("[]","");
s = s.replace("{}","");
}
return s.equals("");
}
}