检查符号是否成对出现
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断该字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 比如 “()”、"()[]{}"、"{[]}" 都是有效字符串,而 “(]” 、"([)]" 则不是。
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* @author LanceQ
* @version 1.0
* @time 2021/5/14 22:09
*/
public class isValidDemo {
public static void main(String[] args) {
String s="()[]{}";
String s1="{[]}";
String s2="(]";
String s3="([)]";
String s4=")]";
System.out.println(isValid(s));
System.out.println(isValid(s1));
System.out.println(isValid(s2));
System.out.println(isValid(s3));
System.out.println(isValid(s4));
}
private static boolean isValid(String s) {
Map<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
Stack<Character> stack = new Stack<>();
int len=s.length();
char[] c= s.toCharArray();
for (int i = 0; i < len; i++) {
if(map.containsKey(c[i])){
char ch=stack.isEmpty() ? '#':stack.pop();
if(!map.get(c[i]).equals(ch)){
return false;
}
}else{
stack.push(c[i]);
}
}
// for (int i = 0; i < len; i++) {
// if(map.containsKey(s.charAt(i))){
// char ch=stack.isEmpty() ? '#':stack.pop();
// if(!map.get(s.charAt(i)).equals(ch)){
// return false;
// }
// }else{
// stack.push(s.charAt(i));
// }
// }
return stack.isEmpty();
}
}
- 首先我们将括号间的对应规则存放在 Map 中,用于下方遍历的时候,进行判断;
- 创建一个栈拥有存储左括号,因为一个左括号后面可能还是左括号,所以要创建stack来存储;
- 然后把String类型转换成char类型来获取每一个字符,不转换可以,可以通过s.charAt(i)来获取每一个字符;
- 遍历判断该元素是否是右边类型的括号,如果符合条件的话,前面一定有左边类型的括号被压进栈中,这个时候,只需要从栈中该前一个元素弹出来进行比较即可;
- 不过,要注意的是,有可能一开始就是右边类型的括号,前面没有压进左边类型的括号,所以在弹出括号的时候,就需要进行判断栈是否为空,为空的话,就随便设置一个字符进行赋值,只需要和左括号类型不一样就行了。如果不进行判断的话,就有报空栈异常“Exception in thread “main” java.util.EmptyStackException”。
- 最后返回判断栈是否为空就可以了,因为如果括号都是成对出现的话,栈里面的元素肯定会全部压出,这个时候一定为空,如果不是成对存在的话,栈就一定不为空,返回的是false。
参考:https://leetcode-cn.com/problemset/all/