1. 题目
给定一个只包括 '(',')','{','}','[',']'
的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意:空字符串可被认为是有效字符串。
2. 相关知识
2.1 哈希表知识
- 哈希表在建立的时候是
key
和value
成对建立的;比如map.put('[', ']');
其中就默认[
是key
,而]
是value
.get()
用来获取哈希表对应key
的value
,比如说哈希表里面有一条内容是map.put('[', ']');
那么通过map.get('[')
返回的结果就是]
.containsKey()
返回的类型是boolean
型,如果存在这个key
就返回true
否则就false
。同样地,也有containsValue()
的方法
2.2 栈的知识
.push()
用来将元素压入栈.pop()
将元素弹出栈(返回栈顶的值,并且删除此元素).peek()
得到栈顶元素的值(不删除这个元素).empty()
返回值为boolean
型,判断栈是否为空- 当栈已经为空的时候,如果这个时候还继续进行
.pop()
的操作,会导致抛出异常Line 21: java.util.EmptyStackException
3. 解题思路
- 将字符串转换成字符数组进行索引
char[] ch = s.toCharArray();
- 进行
ch.length
次循环: - 在每次循环中判断,这个是不是
Hash
表中的左括号(hash
表中的key
值),如果是就将此元素压栈
,遇到右括号的时候(也就是不属于哈希表中key
值的情况)就进行弹栈
,判断出栈的元素对应的哈希表中的value
是否和当前位置上的元素对应的值相同。if(map.get(stack.pop()) != ch[i])
,不相同就代表括号不匹配。 - 但其实这里还需要注意一个问题,就是:当输入是
")"
单个括号的形式,这样的话会直接进行弹栈
操作,如果这个时候栈里本来就是空的,就会抛出异常错误,所以我们必须在建立栈的时候给它塞入一个值,也就是我们开始做的stack.add('?')
。那这个时候,如果出现了上述")"
的情况,我们先检查栈是不是只有一个"?"
元素,如果是,就证明第一个元素就是右括号
,那么就可以直接判断不匹配啦~ - 那么其实还有一个问题,通过这样判断完之后,如果出现这种情况
"()["
那么在整个循环结束后,栈里面还有东西没出来,所以我们应该在最后返回的时候规定,如果在循环结束的时候 栈里不只有"?"
元素,那么这个匹配就是有问题的。
4. 代码
class Solution {
public static boolean isValid(String s) {
HashMap<Character, Character> map = new HashMap<>();
map.put('[', ']');
map.put('(', ')');
map.put('{', '}');
map.put('?','?');
char[] ch = s.toCharArray();
Stack stack = new Stack();
stack.add('?');
boolean temp = false;
if (ch.length==0) return true;
for (int i = 0; i < ch.length; i++) {
if (map.containsKey(ch[i])) {
stack.push(ch[i]);
}
else if (!map.containsKey(ch[i])) {
if (stack.peek()== "?")return false;
if(map.get(stack.pop()) != ch[i]) return false;
else temp = true;
}
}
if(map.get(stack.pop())=='?') temp = true;
else temp = false;
return temp;
}
}