Leetcode刷题JavaScript:括号相关

20有效括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

map键值对
stack
注意sting虽然可以直接通过下标获取对应单字符,但是想要使用splice等数组函数必须先通过split函数转换为数组类型。

var isValid = function(s) {
    //if(s.length%2===1)return false;//奇数一定失败
    const stack=[];//栈
    const map=new Map();
    map.set('(',')');
    map.set('[',']');
    map.set('{','}');
    for(let i=0;i<s.length;i++){
        const c=s[i];
        if(map.has(c)){//传入key({[
            stack.push(c);
        }else{
            const t=stack[stack.length-1]//取栈顶
            if(map.get(t)===c){
                stack.pop();
            }else return false
        }
    }
    return stack.length===0
};

22 括号生产

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

括号与括号之间的关系有两种,在里面和并列
所以a、b也是合法序列的时候,一个合法的序列必然满足(a)b或者 a(b)

push() 是数组的一个方法,主要是将括号里的元素放到数组的后面。e.g:字符串,数组,null,undefined,object ,bealoon。都可以的。
push一个大括号,那意思就是希望往数组中追加一个object,同理push[]追加数组,后面可以通过下标定位给数组赋值。

var generateParenthesis = function(n) {
    if (n === 0) return [];
    //i对括号的组合可能存储在dp[i]
    let dp = [
        [""],
        ["()"]
    ]
    for (let i=2;i<=n;i++) {      // i表示要弄几对括号
        // 括号里面和外面的括号对数
        dp.push([]) ;//追加一个数组
        for(let j=0;j<=i-1;j++) {//0至i-1,i-1至0
            for (const k1 of dp[j]){//两个循环控制括号对数=j+i-j-1=i-1
                for (const k2 of dp[i-j-1]) {
                    dp[i].push(k1 +"("+ k2+  ")" );
                }
            } 
        }

    }
    return dp [n]
};

32最长有效括号

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

用栈实现滑动窗口法

var longestValidParentheses = function(s) {
    let stack = [-1], ans = 0;
    for (let i = 0; i < s.length; i++) {
        if (s[i] === '(') {
            stack.push(i)
        } else {
            stack.pop();
            if (stack.length === 0) {///当前遍历的字符串中)多于(,需要从当前位置开始探索新的可能
                stack.push(i);//栈底保存探索起点
            } else {
                ans = Math.max(ans, i - stack[stack.length - 1]);//栈顶保存最右的未被匹配的(括号
            }
        }
    }
    return ans;
};


678 有效的括号字符

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。

  • 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
    一个空字符串也被视为有效字符串。

匹配问题的思想:双栈法,分别把(和*放入两个栈

var checkValidString = function(s) {
    let stack_left=[],stack_star=[];
    for(let i=0;i<s.length;i++){
        if(s[i]=="("){
            stack_left.push(i);
        }
        else if(s[i]=="*"){
            stack_star.push(i);
        }
        else{
            if(stack_left.length){
                stack_left.pop();
            }
            else if(stack_star.length){
                stack_star.pop();
            }
            else return false;
        }
    }
    while(stack_left.length&&stack_star.length){//配对对位置有要求
        if(stack_left.pop()>stack_star.pop()){
            return false;
        }
    }
    return !stack_left.length;
}

856 括号的分数

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。

//我的思路是拆分 (()())=(())+(())
var scoreOfParentheses = function(S) {
    let stack = [], grad = 0;
    for (let i = 0; i < S.length; i++) {
        if (S[i] === '(') {
            stack.push(i);
        } else {//遇到右括号开始算
            grad+=Math.pow(2,stack.length-1);
            while(S[++i] === ')') stack.pop();
            
        }
    }
    return grad;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值