题目
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
题目理解:
这里说的是最长有效子串,返回长度,看一个例子:
() ) ()()()
中间应该没有空格,我加上了,仔细看,这个应该返回的是6,因为需要连续,所以前两个就被舍弃了。
()(())
这样的类型也是有效的,所以返回也是6.
1.想法:
自己想到之前的有效括号了,按照那个思想,先建立一个栈,在栈中遇到“(”就把“)”压入栈中,但是在遇到“)”或者出栈时候为空的情况没有考虑清楚,感觉这样一道不算难的题变得不好做了,看了评论才知道,原来是找连续的括号长度,让我对题目有了更深的理解。
这道题自己没有做出来,但是看到评论中说遇到过这样的面试题,15分钟,所以准备好好看一下怎么解答,就看一下官方的视频。
2.解法
2.1 方法1
暴力破解:
括号是成对出现的,那么如图长度是7, 我们就应该从小于长度的最大偶数即6开始遍历。找到其中是否有最长有效,没有就长度为4进行遍历,找到有效的后就可以返回,这样就是最长的了。
大概的思路:先写一个判断是否有效isvalid()的方法,其中遇到左括号 就入栈,遇到右括号判断栈顶元素是否是左括号,是的话就弹出,其余情况就返回false。
写完后,就进行小于或等于长度的偶数遍历,就比较当前值和下一个值的括号是否有效。
接下来尝试一下代码的编写吧:
class Solution {
public int longestValidParentheses(String s) {
//判断是否为偶数
int len = s.length();
if(len<2) return 0;
int maxlen= 0;
for(int i = 0;i<len;i++)
{
for(int j = i+2;j<len+1;j+=2)
{
if(isValid(s.substring(i,j)))
{
maxlen=Math.max(maxlen,j-i);
}
}
}
return maxlen ;
}
public boolean isValid(String s)
{
Stack<Character> stack = new Stack<>();
for(char ch:s.toCharArray())
{
if(ch=='(')
{
stack.push('(');
}
else if(!stack.isEmpty() &&stack.peek