「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。
题目:给定一个字符串,字符串中只包含( ) { } [ ] 此六种字符,要求判断该字符串是否有效。有效字符串是指在顺序正确的情况下,左右括号匹配。
解题思路
关于括号匹配,当时学栈的时候遇到过,本题也可以使用栈来解决问题。解决方法为:在正式开始判断前,可以首先判断字符串的长度是否为偶数,因为有效字符串必定是偶数,如果是奇数则直接返回false即可。之后创建一个map来存入左右括号,其中右括号为键,左括号为值,map的作用就是判断当前循环到的字符是执行入栈还是出栈操作。之后遍历字符串,每次遍历首先查看当前字符是否在map中,如果存在则查看栈顶元素是否和map对应的值相等,不相等直接返回false,相等则元素出栈,遍历结束如果没有返回false则查看当前栈是否为空(此处不能直接返回true,因为存在只有左括号的情况,此时程序可以全部结束并且不返回false),代码如下:
public static boolean isValid(String s) {
int len = s.length();
if(len%2!=0) return false;
HashMap<Character, Character> characterHashMap = new HashMap<>();
characterHashMap.put(')','(');
characterHashMap.put(']','[');
characterHashMap.put('}','{');
Stack<Character> stack = new Stack<>();
for(int i=0;i<len;i++){
char c = s.charAt(i);
if(characterHashMap.containsKey(c)){
if(stack.isEmpty() || stack.peek()!=characterHashMap.get(c)){
return false;
}
stack.pop();
}else {
stack.push(c);
}
}
return stack.isEmpty();
}
算法的时间复杂度为, 空间复杂度需要统计每次栈剩余元素。
优化解
上述代码使用了map存储键值对,在LeetCode题解中,看到了一个大佬没有使用map,但代码思路非常清晰,其思路为:遍历字符串,判断当前字符是否为左括号,如果遇到左括号,那入栈一个与左括号对应的右括号,依次类推。如果不是左括号,若栈为空,直接返回false,否则栈顶元素出栈,栈顶元素不等于当前元素,返回false,依次类推,直到最后判断栈是否为空,代码如下:
public static boolean isValid2(String s) {
if(s.length()%2!=0) return false;
Stack<Character> stack = new Stack<>();
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();
}
该算法的时间复杂度依然为,空间复杂度也取决栈元素个数。