题目描述:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
思路:
- 这道题和“有效括号”类似。首先需要找到哪些括号是有效的,可以借助栈来完成,遍历字符串,压入’(’,遇到’)’,退栈,这时就找到了两个相互对应的一组括号。
- 要求是最长的括号字串,则需要在前面退栈的过程中记录括号的位置,之后在遍历,寻找最长的连续字串即可
代码(Java):
class Solution {
public int longestValidParentheses(String s) {
int point = -1; //栈的指针
int[] stack = new int[s.length()]; //栈,压入'('位置
int[] get = new int[s.length()+1]; //记录有效括号的位置
char[] str = s.toCharArray();
for (int i = 0; i < str.length; i++){
if (str[i] == '('){ //入栈
stack[++point] = i;
}else if (point >= 0){ //遇到')'出栈
int pr = stack[point--];
get[i] = get[pr] = 1;
}else{
continue;
}
}
int re = 0, count = 0;
for (int i = 0; i <= str.length; i++){ //寻找最长的连续子串
if (get[i] == 1) count++;
else{
re = re > count? re : count;
count = 0;
}
}
return re;
}
}