前端算法(20)

45 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。  
输入: 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;
    }
}