题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
代码
class Solution {
public boolean isValid(String s) {
Deque<Character> stack=new ArrayDeque<>();//初始栈
/*在入栈之前,我们要把出现在左边的左括号要入栈,把出现在右边的右括号要与入栈的左括号进行比较,
* 所以在入栈之前要进行判断,既然是匹配的出现,我们可以用Hashsmap,具体实现见代码*/
HashMap<Character,Character> hashMap=new HashMap<>();
hashMap.put(')','(');//以右括号为键,以左括号为值
hashMap.put(']','[');
hashMap.put('}','{');
int length=s.length();
if(length%2!=0) return false;//既然是成对出现,那么出现的字符串应该是偶数
for(int i=0;i<length;i++){
char ch=s.charAt(i);
if(hashMap.containsKey(ch)){
if(stack.isEmpty()||stack.peek()!=hashMap.get(ch)){//在栈中没有找到匹配的左括号
return false;
}
stack.pop();//知道之后就出栈
}else {//将左括号进行入栈操作
stack.push(ch);
}
}
return stack.isEmpty();//循环中将不满足的已经去除,如果循环正常结束,那么最后栈中没有任何元素,所以栈为空,返回即可
}
}