最长有效括号(栈)

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"

示例 2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//错误写法,这里贴出来与后面的AC代码做对比。错误的原因在于“)()())”的解为2,记数的方式不行
public class Main {

	public static void main(String[] args) {
		String s = ")()())";
//              String s = ")()((())";
		System.out.println(longestValidParentheses(s));
	}
	
    public static int longestValidParentheses(String s) {
    	int ans = 0;
    	int tmp = 0;
    	Stack<String> stack = new Stack<>();
    	if (s.length() != 0) {
    		stack.push(String.valueOf(s.charAt(0)));
    	}
    	for (int i=1; i<s.length(); i++) {
    		if (stack.peek().equals("(")) {
    			if (String.valueOf(s.charAt(i)).equals(")")) {
    				stack.pop();
    				tmp += 2;
    			} else {
    				stack.push(String.valueOf(s.charAt(i)));
    				tmp = 0;
    			}
    		} else {
    			stack.push(String.valueOf(s.charAt(i)));
    			tmp = 0;
    		}
    		if (tmp > ans) {
    			ans = tmp;
    		}
    	}
    	return ans;
    	
    }
    
}
//还是用栈,只是现在将数组下标存入栈中。
//遇到'('就将下标存如栈中,遇到')'就将栈顶的下标出栈,然后计算距离
public class Main {

	public static void main(String[] args) {
//		String s = ")()())";
		String s = ")()((())";
		System.out.println(longestValidParentheses(s));
	}
	
    public static int longestValidParentheses(String s) {
    	int ans = 0;
    	Stack<Integer> stack = new Stack<Integer>();
    	stack.add(-1);
    	for (int i=0; i<s.length(); i++) {
    		if (s.charAt(i) == '(') {
    			stack.push(i);
    		} else {
    			stack.pop();
    			if (stack.empty()) {
    				stack.add(i);
    			} else {
    				ans = Math.max(ans, i-stack.peek());
    			}
    		}
    	}
    	return ans;
    }
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章