Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

思路一:

比较笨的方法。借助栈进行括号的匹配,栈中存储的是字符在字符串中的位置,借助一个与字符串相同长度的数据来记录哪些字符是被匹配过的,扫描过一遍字符串之后,再扫描一遍数组,便可得出最长的有效括号序列。

 1 public int longestValidParentheses(String s) {
 2         if(s == null || s.length() == 1) {
 3             return 0;
 4         }
 5         int[] mark = new int[s.length()];
 6         Stack<Integer> stack = new Stack<Integer>();
 7         for(int i=0; i<s.length(); i++) {
 8             if(stack.isEmpty()) {
 9                 stack.push(i);
10                 continue;
11             }
12             int top = stack.peek();
13             if(s.charAt(top) == '(' && s.charAt(i) == ')') {
14                 stack.pop();
15                 mark[top] = 1;
16                 mark[i] = 1;
17             } else {
18                 stack.push(i);
19             }
20         }
21         int ret = 0;
22         int count = 0;
23         for(int i=0; i<mark.length; i++) {
24             if(mark[i] == 1) {
25                 count++;
26                 ret = Math.max(ret, count);
27             } else {
28                 count = 0;
29             }
30         }
31         return ret;
32     }

思路二:

也是借用栈,但是栈中只保存'('。

tmp表示当前计算的一套完整的括号集的长度,完整是指消耗掉栈中所有的'('

sum表示几个连续的完整括号集的总长。

当出现不完整的括号集,需要独立拿出来计算,作为一个阶段性的结果,这时已匹配括号集的长度是当前字符所在位置与栈顶元素之差。

当栈为空时,出现一个')',说明之前的括号集与下一个括号集之间已不连续,sum需要置0。

 1 public int longestValidParenthesesII(String s) {
 2         if(s == null || s.length() == 1) {
 3             return 0;
 4         }
 5         Stack<Integer> stack = new Stack<Integer>();
 6         int ret = 0;
 7         int sum = 0;
 8         for(int i=0; i<s.length(); i++) {
 9             char ch = s.charAt(i);
10             if(ch == '(') {
11                 stack.push(i);
12             } else {
13                 if(stack.isEmpty()) {
14                     // 栈中没有'(',出现')'
15                     sum = 0;
16                     continue;
17                 }
18                 int tmp = i - stack.pop() + 1;
19                 if(stack.isEmpty()) {
20                     // 有一套完整的括号集,可以加到前面的一整套括号集上
21                     sum += tmp;
22                     ret = Math.max(ret, sum);
23                 } else {
24                     // 可能是一个未完成的括号集, 计算阶段性的结果
25                     tmp = i - stack.peek();
26                     ret = Math.max(ret, tmp);
27                 }
28             }
29         }
30         return ret;
31     }

 

posted on 2015-03-24 09:52  绿树荫  阅读(118)  评论(0编辑  收藏  举报

导航