每日一题算法:2020年7月4日 最长有效括号 longestValidParentheses

2020年7月4日 最长有效括号 longestValidParentheses

在这里插入图片描述

默认格式:

class Solution {
    public int longestValidParentheses(String s) {
        return 0;
    }
}

解题思路:

这道题感觉没有困难的难度啊,这不就是使用简单的栈的思想就能实现的吗?插入的是右括号的情况下,如果栈顶是左括号就弹出,否则就压入。这样计算弹出的个数,就能知道匹配的长度是多少了。

仔细一想并不是这样,因为使用该方式得到的是总的长度,并不是连续的长度。

所以我们需要使用一些状态码来记录当前是否是连续的状态。

先写一个栈的代码:

class Stack{
    
    Node head;
    
    public void push(int val){
        Node node=new Node(val);
        
        node.next=head;
        head=node;
    }
    public int pop(){
        int val = head.val;
        head=head.next;
        return val;
    }
}
class Node{

    int val;
    Node next;
    Node(int val){
        this.val=val;
    }
}

可以先列举一下可能会出现的无效的所有情况,对这些情况进行分析,最后找到通用的算法。

1,出现在最开头的“)”和多余的“(”

)))))()

((((()

2,出现在末尾的多出的“)”或者“(”

()))))

()((((

3出现在中间的多余的“(”,")"

()((()

()))()

这些情况如果出现在栈中需要如何处理:

1,进行判断,栈为空时插入“)”时,直接跳过

2,不处理

3,实际情况会和1一直,因为插入2的时候1会弹出

4,和2一致,不处理

5,和2一致,不处理

6,和1一致

栈的用法图解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

继续入栈两个“(”。
在这里插入图片描述

下标5是“)”而且栈不为空,清空数组中的值
在这里插入图片描述

下标6入栈
在这里插入图片描述
在这里插入图片描述

这只是一种处理方式,我们可以通过计算数组中最长连续空的长度来决定实际的最大长度。
在这里插入图片描述

 public int longestValidParentheses(String s) {

        int max=0;

        Stack stack=new Stack();

        char[] chars=s.toCharArray();

        for (int i=0;i<chars.length;i++){
            if (chars[i]=='('){
                stack.push(i);
            }else {
                if (stack.head!=null){

                    chars[i]='0';
                    chars[stack.pop()]='0';
                }
            }
        }


        int val=0;
        for (int i=0;i<chars.length;i++){
            if (chars[i]=='0'){

                val++;
                max= Math.max(val,max );

            }else
                val=0;
        }


        return max;
    }

    class Stack{

        Node head;

        public void push(int val){
            Node node=new Node(val);

            node.next=head;
            head=node;
        }
        public int pop(){
            int val = head.val;
            head=head.next;
            return val;
        }
    }
    class Node{

        int val;
        Node next;
        Node(int val){
            this.val=val;
        }
    }

细节部分还可以优化,但是今天是周末,想休息了,就这样吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值