有效的括号
思路:有效的括号,涉及到成对元素,要想到使用栈Stack,这里使用Java中Stack的子类Deque。要定义规则什么才是有效的括号,这里使用Map结构定义有效的键值对。涉及到的有stack.peek()栈顶元素、stack.size()栈内元素个数、stack.push()添加元素、stack.pop()从栈顶移除元素、map.containsKey()、map.get()
Java
class Solution {
public boolean isValid(String s) {
// 1、当字符串长度为奇数时,一定不是有效括号
if(s.length() % 2 == 1){
return false;
}
// 2、声明Map集合,定义有效括号的规则
Map<Character,Character> map = new HashMap<>();
map.put('}','{');
map.put(']','[');
map.put(')','(');
// 3、定义栈(栈多用于成对元素)
Deque<Character> stack = new LinkedList<>();
// 4、遍历字符串中的字符
for(int i = 0;i < s.length();i++){
// 4.1 当前字符是右括号时,去匹配栈中元素
if(map.containsKey(s.charAt(i))){
// 如果此时栈中无元素 或者栈顶元素与当前右括号不匹配就返回false
if(stack.size()==0 || stack.peek() != map.get(s.charAt(i))){
return false;
}
// 符合则移除栈顶元素
stack.pop();
}else{
// 4.2 当前元素是左括号,就放入栈中,等待匹配
stack.push(s.charAt(i));
}
}
return stack.size()==0;
}
}
JS
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s.length%2==1){return false;}
let myMap=new Map([
[')','('],
[']','['],
['}','{']
])
//需要将左括号放入栈中,先进后出,遇到有括号就和栈中最外面的元素进行匹配
let stk=[];
for(let item of s){
if(myMap.has(item)){
//!!!!这里第一遍提交错误,后加了下面的if,第二遍错误后判断条件改为哈希表的值与栈内最后面的元素是否相等
if(myMap.get(item)==stk[stk.length-1]){
stk.pop();//若匹配成功,.pop用于删除数组中最后一个元素
}
else{return false;}
}
else{
stk.push(item);//遇到左括号就放入栈中
}
}
return !stk.length;//栈内有元素代表有元素未匹配成功,返回false
};