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 }