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

    技术2026-01-09  9

    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; } }

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

    Processed: 0.023, SQL: 10