给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例 1:
输入: “()” 输出: true
示例 2:
输入: “()[]{}” 输出: true
示例 3:
输入: “(]” 输出: false
示例 4:
输入: “([)]” 输出: false
示例 5:
输入: “{[]}” 输出: true
思路:
思路很简单,利用栈,通过率也很高,重点是如何进行优化
具体思路:
遍历字符串,如果是左括号就push,是右括号就检测:栈空或pop出来的字符不是对应左括号则return false。遍历结束判断栈是否为空,不为空则return false,否则return true
Stack不支持char等基本类型,所以可以选择用String判断或者用Character判断
结果:用String的话耗时14ms,用Character耗时7~9ms
还有一种优化方法是将Stack用char数组实现,能到5ms左右
另外 String转成char有两种方法:
1 String.charAt(i)
2 String.toCharArray()
char转成String:
1 String.valueOf(‘字符’)
2 Character.toString(‘字符’)
3 “” + ‘字符’【效率很低】
用Character的代码:
class Solution {
public boolean isValid(String s) {
boolean valid = true;
if (s == "")
return valid;
Stack<Character> stack = new Stack<>();
for (int i = 0;i < s.length();i++){
char c = s.charAt(i);
if (c == '(' || c == '{' || c == '['){
stack.push(c);
continue;
}
if (c == ')'){
if (stack.empty() || !(stack.pop() == '(')){
valid = false;
return valid;
}
}
if (c == '}'){
if (stack.empty() || !(stack.pop() == '{')){
valid = false;
return valid;
}
}
if (c == ']'){
if (stack.empty() || !(stack.pop() == '[')){
valid = false;
return valid;
}
}
}
if (!stack.empty())
valid = false;
System.out.println(stack);
return valid;
}
}