本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
输入: s = "()"
输出: true
解题思路
思路一
根据栈后进先出的特性,我们先遍历字符串,按条件入栈,入栈时,只考虑左括号,没遇到一个左括号,就将其对应的右括号入栈。遍历的元素是右括号时, 当前栈的长度为0,则说明没有可以与之匹配的左括号,直接返回false, 将栈顶元素出栈,与该右括号对比,如果不同则直接返回false,反之继续遍历,这样就完美实现了
var isValid = function(s) {
const arr = s.split("");
const rightStack = [];
for(let i = 0;i<arr.length;i++){
if(arr[i] === '('){
rightStack.push(')');
}else if(arr[i] === '['){
rightStack.push(']');
}else if(arr[i] === '{'){
rightStack.push('}')
}else{
if(rightStack.length === 0)return false;
else{
right = rightStack.pop();
if(right !== arr[i]){
return false;
}
}
}
}
if(rightStack.length === 0) return true;
return false;
};
思路二
我们先判断相邻的两个是否是一组,如果是下标直接进2。如果不是则判断当前值是否与栈中最后一个是一组,如果是,栈中最后一个符号出栈,下标进1。如果不是则当前符合进栈,下标进1,判断当前是否是有效的括号时,直接判断栈中的是否有数据,无则符合;有则不符合,因为字符串中没有匹配完栈中存储的符号值
const ConditionMap = {
'(': ')',
'{': '}',
'[': ']',
};
const StackConditionMap = {
')': '(',
'}': '{',
']': '[',
};
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const stack = [];
let result = false;
let index = 0;
while(s.length) {
if (index >= s.length) {
break;
}
if (index < s.length - 1 && ConditionMap[s[index]] === s[index + 1]) {
index += 2;
} else if (stack.length > 0 && StackConditionMap[s[index]] === stack[stack.length - 1]) {
stack.pop();
index += 1;
} else {
stack.push(s[index]);
index += 1;
}
}
if (stack.length === 0) {
result = true;
}
}