有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()” 输出: true
示例 2:
输入: “()[]{}” 输出: true
示例 3:
输入: “(]” 输出: false
示例 4:
输入: “([)]” 输出: false
示例 5:
输入: “{[]}” 输出: true
思路1:
1.如果字符串长度是奇数,一定不是有效括号。
2.遇到左括号就添加到栈中,遇到右括号则到栈的顶端寻找,看是否匹配,如果相同则把左括号从栈顶端移除,不相同则直接说明不是有效括号。
3.最后还要看栈中是否还有元素,如果有则说明不是有效括号。
class Solution {
public boolean isValid(String s) {
if(s==null||s.length()==0){
return true;
}
if(s.length()%2==1){
return false;
}
Map<Character,Character> map=new HashMap();
map.put(')','(');
map.put('}','{');
map.put(']','[');
Stack<Character> stack=new Stack<>();
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
stack.push(s.charAt(i));
}
else{
if(!stack.empty()&&stack.peek()!=null&&map.get(s.charAt(i)).equals(stack.peek())){
stack.pop();
}
else{
return false;
}
}
}
return stack.empty();
}
}
执行用时 :3 ms, 在所有 Java 提交中击败了54.61%的用户
内存消耗 :37.1 MB, 在所有 Java 提交中击败了5.05%的用户
思路2:看题解看到一种不用数据结构的方法,用计数处理,分三类,遇到左括号就++,遇到右括号则–。
class Solution {
public boolean isValid(String s) {
int x = 0;
int y = 0;
int z = 0;
int xy = 0;
int xz = 0;
int yx = 0;
int yz = 0;
int zx = 0;
int zy = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
x++;
if (y > 0) yx++;
if (z > 0) zx++;
} else if (s.charAt(i) == ')') {
if (x == 1 && (xz != 0 || xy != 0)) return false;
x--;
if (y > 0) yx--;
if (z > 0) zx--;
} else if (s.charAt(i) == '[') {
y++;
if (x > 0) xy++;
if (z > 0) zy++;
} else if (s.charAt(i) == ']') {
if (y == 1 && (yx != 0 || yz != 0)) return false;
y--;
if (x > 0) xy--;
if (z > 0) zy--;
} else if (s.charAt(i) == '{') {
z++;
if (x > 0) xz++;
if (y > 0) yz++;
} else if (s.charAt(i) == '}') {
if (z == 1 && (zx != 0 || zy != 0)) return false;
z--;
if (x > 0) xz--;
if (y > 0) yz--;
} else {
return false;
}
}
return x == 0 && y == 0 && z == 0;
}
}
作者:f1ne
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/bu-shi-yong-e-wai-de-shu-ju-jie-gou-shi-yong-ji-sh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。