给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
括号匹配是使用栈解决的经典问题。
规律:先出现的左括号后匹配
模式识别:先进后出使用栈作为辅助结构
代码:1.使用HashMap存储对应的左右括号,其中右括号作为key,左括号作为value;
2.创建一个linkedList对象
为什么使用Deque而不是List接口?
对于linkedList,下面程序需要使用的方法:peek() //获取但不移除列表的头(第一个元素),是从Deque接口中继承的
class Solution {
public boolean isValid(String s) {
int len = s.length(); //字符串的长度
if(len % 2 == 1 ){ //如果字符串长度为奇数,返回false
return false;
}
Map map = new HashMap<>();
map.put('>','<'); //键值对
map.put(']','[');
map.put('}','{');
map.put(')','(');
//先出现的左括号后匹配,使用栈
Deque st = new linkedList<>(); //为什么使用Deque接口?
for(int i = 0;i < len; i++){
char c = s.charAt(i); //字符串的每一个字符
if(map.containsKey(c)){ //判断是否是右括号
//是右括号,判断是否匹配
//如果栈为空或栈顶元素不是对应的左括号,则不匹配;否则,匹配,将栈顶的左括号出栈
if( st.isEmpty() || st.peek() != map.get(c)) { //列表包含元素或者列表的头不等于key对应的value值
return false;
}
st.pop(); //出栈,移除堆栈顶部的对象
}else{
//不是右括号,将左括号入栈
st.push(c); //入栈,把项压入堆栈顶部
}
}
return st.isEmpty();
}
}



