解题的思路:
运用栈,找反例
1.给定的是个字符串,首先要把字符串转为字符数组一个个判断。
2找不满足闭合条件的反例即可。(]->false
解题步骤:
1.碰到左括号,直接入栈,碰到右括号,出栈,查看是否匹配即可
2.碰到右括号直接弹出栈顶元素,查看是否匹配若不匹配,找到反例,若匹配,就接着向后扫描字符
3.栈中只存储左括号,栈顶就是最新的左括号4.当扫描完整个字符串后仍然没找到反例且当前栈为空,说明str是一个满足条件的字符串
代码
public class Num20_isValidStr {
public boolean isValid(String s){
Stack<Character> stack = new Stack<>();
//将字符串转为字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(' || c == '[' || c == '{') {
//c全是左括号,直接入栈
stack.push(c);
}else{
//此时碰到了右括号,弹出栈顶元素查看是否匹配
//边界条件,stack.pop stack不为空
if(stack.isEmpty()) {
//右括号是第一个碰到的字符,没有左括号和他闭合,一点是false
return false;
}
char top = stack.pop();
//找反例
if(c == ')' && top != '(') {
//找到反例
return false;
} if(c == ']' && top != '[') {
//找到反例
return false;
} if(c == '}' && top != '{') {
//找到反例
return false;
}
}
}//若栈不为空,左括号大于右括号
return stack.isEmpty();
}
}
为什么str扫描完没找到反例还要判断栈是否为空?
因为最终所有的右括号都匹配结束之后,还剩下了若干个左括号,没有办法闭合
例如{)( =>(没法闭合