题目:
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
思路:
字符串转为字符数组,将所有可以匹配的字符数组的下标记录下来,找到最长连续数列的长度,就是最长有效括号的子串的长度。
Java实现:
package top100;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Stack;
public class Demo32 {
static int longestValidParentheses(String s){
if (s == null || s.length()<=0)
return 0;
char[] array = s.toCharArray();
ArrayList<Integer> validList = new ArrayList<>();
Stack<Integer> stack = new Stack<>();
for (int i=0;i<array.length;i++){
if (array[i] == '('){
stack.push(i);//存入正括号下标
}else {
if (!stack.isEmpty()){
validList.add(i);
validList.add(stack.pop());
}
}
}
//找出最长连续数列的长度
int left= 0;
int right = 1;
int maxLen = 0;
validList.sort(Comparator.naturalOrder());
System.out.println(validList.toString());
while (right<validList.size()){
if (validList.get(right) != validList.get(right-1)+1){
left = right;
}else {
maxLen= Math.max(maxLen,right-left+1);//找到连续的数列时,再计算长度,长度为right-left+1
}
right++;
}
return maxLen;
}
public static void main(String[] args) {
System.out.println(longestValidParentheses(")(()())))"));
}
}
版权声明:本文为qq847411原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。