【LeetCode 32】Longest Valid Parentheses【H】

来源:互联网 发布:网络摄像头电脑客户端 编辑:程序博客网 时间:2024/06/16 18:23

求所给字符串中合理的括号串的最大长度。(所给字符串只包含 ‘(’ 和 ‘)’ )


1.动态规划算法(DP)

定义数组 longest:先根据所给字符串 s 的长度来申请创建一个一维的 int 型数组 longestlongest[i] 表示一个合理括号串的长度,该合理括号串是以 s[i] 为结尾的。

如何进行迭代:

1. 若 s[i] == ‘(‘,那么 longest[i] = 0;
2. 若 s[i] == ‘)’,那么要分2种情况:
2.1 若 s[i-1] == '(',那么 longest[i] = longest[i-1] + 22.2 若 s[i-1] == ')',那么我们需要做一个判断:s[i-1-longest[i-1]] =?= '(',如果等于,那么说明 s[i-1-longest[i-1]] 能够与 s[i] 配对为 '()',于是有下面的迭代:longest[i] = longest[i-1] + 2 + longest[i-2-longest[i-1]];否则,longest[i] = 0。

说明:对于1,若最后一位是 ‘(‘,那么最长的合理括号串的长度肯定为0,即不存在;对于2.1,如果最后一位是 ‘)’ 并且它的前一位是 ‘(‘,那么两者刚好能形成一个合理的括号串,由此可以迭代出:longest[i] = longest[i-1] + 2;对于2.2,此时最后2位是 ‘))’ 的形式,如果判断结果是 true,那么说明 s[i-1-longest[i-1]] 能够与 s[i] 配对为 ‘()’,即表明 s[i-1-longest[i-1]] 和 s[i] 之间的括号都是合理的,此后我们再加上 longest[i-2-longest[i-1]] ,就完成了迭代。

如何赋予初值:

longest[0] = 0
longest[1] = (s.charAt(0)==’(’ && s.charAt(1)==’)’) ? 2 : 0

需要注意的点:

防止数组的越界,在相应的地方需要做一下判断。

Java代码如下:

public int longestValidParentheses(String s) {        int len = s.length();        if (len == 0 || len == 1) {            return 0;        }        int[] longest = new int[len];        longest[0] = 0;        longest[1] = (s.charAt(0)=='(' && s.charAt(1)==')') ? 2 : 0;        int ret = longest[1];        for (int i = 2; i < len; i++) {            if (s.charAt(i) == '(') {                longest[i] = 0;                // continue;            } else {                if (s.charAt(i-1) == '(') {     // s[i-1] = '(' && s[i] = ')'                    longest[i] = longest[i-2] + 2;                    ret = Math.max(ret, longest[i]);                } else {                        // s[i-1] = ')' && s[i] = ')'                    if (i-1-longest[i-1] >= 0 && s.charAt(i-1-longest[i-1]) == '(') {                        longest[i] = longest[i-1] + 2 + ((i-2-longest[i-1] >= 0) ? longest[i-2-longest[i-1]] : 0);                        ret = Math.max(ret, longest[i]);                    } else {                        longest[i] = 0;                    }                }            }        }        return ret;

2.使用 Stack(栈)

注意压入栈中的是序号(index),而不是字符

代码源自:https://discuss.leetcode.com/topic/7234/simple-java-solution-o-n-time-one-stack/

public class Solution {    public int longestValidParentheses(String s) {        LinkedList<Integer> stack = new LinkedList<>();        int result = 0;        stack.push(-1);        for (int i = 0; i < s.length(); i++) {            if (s.charAt(i) == ')' && stack.size() > 1 && s.charAt(stack.peek()) == '(') {                stack.pop();                result = Math.max(result, i - stack.peek());            } else {                stack.push(i);            }        }        return result;    }}
原创粉丝点击