题目
Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())" Output: 4 Explanation: The longest valid parentheses substring is"()()"
题意
寻找一系列( 、)字串的最长良好格式匹配
解法
1.暴力
我们直接从字符串的每个位置字符出发,寻找最长匹配(唯一的优化就是当你位置出发到终点的距离比当前寻找到的最长匹配还短,就不继续寻找了) 我们可以把 ( 当1,)当-1,当和为0时说明匹配正确,当前为负时直接说明匹配已不可能继续
例如
)()())
从index 0开始,),-1 已经决定这个匹配不完美,退出
从index 1开始, ( ) ( ) =0 长度为4
从index 2开始 2+4已经>=6 不再寻找
2.使用栈
这里栈与之前一些栈操作有所不同,这里是压栈字符的位置index。
遇到 ‘( ’ 进行将位置index压栈
遇到 ' )' 进行出栈操作
然后根据index进行计算最长匹配
代码
暴力法:
class Solution {
public int longestValidParentheses(String s) {
char []arr=s.toCharArray();
int res=0;
int max=0,cur=0;
int sum=0;
for(int i=0;i<s.length();i++){
int j=i;
cur=0;
sum=0;
if(j+max>s.length()) break;
while(j<s.length()){
if(arr[j]=='(') sum++;
else sum--;
cur++;
if(sum==0){
if(cur>max) max=cur;
}
else if(sum<0) {
break;
}
j++;
}
}
return max;
}
}
栈方法:
class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<Integer>();
int max=0;
int left = -1;
for(int j=0;j<s.length();j++){
if(s.charAt(j)=='(') stack.push(j);
else {
if (stack.isEmpty()) left=j;
else{
stack.pop();
if(stack.isEmpty()) max=Math.max(max,j-left);
else max=Math.max(max,j-stack.peek());
}
}
}
return max;
}
}

1184

被折叠的 条评论
为什么被折叠?



