2020年7月4日 最长有效括号 longestValidParentheses
默认格式:
class Solution {
public int longestValidParentheses(String s) {
return 0;
}
}
解题思路:
这道题感觉没有困难的难度啊,这不就是使用简单的栈的思想就能实现的吗?插入的是右括号的情况下,如果栈顶是左括号就弹出,否则就压入。这样计算弹出的个数,就能知道匹配的长度是多少了。
仔细一想并不是这样,因为使用该方式得到的是总的长度,并不是连续的长度。
所以我们需要使用一些状态码来记录当前是否是连续的状态。
先写一个栈的代码:
class Stack{
Node head;
public void push(int val){
Node node=new Node(val);
node.next=head;
head=node;
}
public int pop(){
int val = head.val;
head=head.next;
return val;
}
}
class Node{
int val;
Node next;
Node(int val){
this.val=val;
}
}
可以先列举一下可能会出现的无效的所有情况,对这些情况进行分析,最后找到通用的算法。
1,出现在最开头的“)”和多余的“(”
)))))()
((((()
2,出现在末尾的多出的“)”或者“(”
()))))
()((((
3出现在中间的多余的“(”,")"
()((()
()))()
这些情况如果出现在栈中需要如何处理:
1,进行判断,栈为空时插入“)”时,直接跳过
2,不处理
3,实际情况会和1一直,因为插入2的时候1会弹出
4,和2一致,不处理
5,和2一致,不处理
6,和1一致
栈的用法图解:
继续入栈两个“(”。
下标5是“)”而且栈不为空,清空数组中的值
下标6入栈
这只是一种处理方式,我们可以通过计算数组中最长连续空的长度来决定实际的最大长度。
public int longestValidParentheses(String s) {
int max=0;
Stack stack=new Stack();
char[] chars=s.toCharArray();
for (int i=0;i<chars.length;i++){
if (chars[i]=='('){
stack.push(i);
}else {
if (stack.head!=null){
chars[i]='0';
chars[stack.pop()]='0';
}
}
}
int val=0;
for (int i=0;i<chars.length;i++){
if (chars[i]=='0'){
val++;
max= Math.max(val,max );
}else
val=0;
}
return max;
}
class Stack{
Node head;
public void push(int val){
Node node=new Node(val);
node.next=head;
head=node;
}
public int pop(){
int val = head.val;
head=head.next;
return val;
}
}
class Node{
int val;
Node next;
Node(int val){
this.val=val;
}
}
细节部分还可以优化,但是今天是周末,想休息了,就这样吧。