zoukankan      html  css  js  c++  java
  • [LeetCode] 32. Longest Valid Parentheses 最长有效括号

    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 "()()"

    可以用 DP或者Stack来解。

    栈 Stack:定义个start变量来记录合法括号串的起始位置,遍历字符串,如果遇到左括号,则将当前下标压入栈,如果遇到右括号,如果当前栈为空,则将下一个坐标位置记录到start,如果栈不为空,则将栈顶元素取出,此时若栈为空,则更新结果和i - start + 1中的较大值,否则更新结果和i - 栈顶元素中的较大值。

    Java:

    public static int longestValidParentheses(String s) {
    	Stack<int[]> stack = new Stack<int[]>();
    	int result = 0;
     
    	for(int i=0; i<=s.length()-1; i++){
    		char c = s.charAt(i);
    		if(c=='('){
    			int[] a = {i,0};
    			stack.push(a);
    		}else{
    			if(stack.empty()||stack.peek()[1]==1){
    				int[] a = {i,1};
    				stack.push(a);
    			}else{
    				stack.pop();
    				int currentLen=0;
    				if(stack.empty()){
    					currentLen = i+1;
    				}else{
    					currentLen = i-stack.peek()[0];
    				}
    				result = Math.max(result, currentLen);
    			}
    		}
    	}
     
    	return result;
    }
    

    Python:

    # Time:  O(n)
    # Space: O(n)
    class Solution2:
        # @param s, a string
        # @return an integer
        def longestValidParentheses(self, s):
            longest, last, indices = 0, -1, []
            for i in xrange(len(s)):
                if s[i] == '(':
                    indices.append(i)
                elif not indices:
                    last = i
                else:
                    indices.pop()
                    if not indices:
                        longest = max(longest, i - last)
                    else:
                        longest = max(longest, i - indices[-1])
            return longest
    

    C++:

    class Solution {
    public:
        int longestValidParentheses(string s) {
            int res = 0, start = 0;
            stack<int> m;
            for (int i = 0; i < s.size(); ++i) {
                if (s[i] == '(') m.push(i);
                else if (s[i] == ')') {
                    if (m.empty()) start = i + 1;
                    else {
                        m.pop();
                        res = m.empty() ? max(res, i - start + 1) : max(res, i - m.top());
                    }
                }
            }
            return res;
        }
    };
    

      

    类似题目:

    [LeetCode] 20. Valid Parentheses 合法括号

    [LeetCode] 22. Generate Parentheses

    [LeetCode] 241. Different Ways to Add Parentheses

    [LeetCode] 301. Remove Invalid Parentheses

      

    All LeetCode Questions List 题目汇总

      

  • 相关阅读:
    ios-表视图-demo4-内容自己适应高度
    ios-表视图-demo3-单选
    应用管理的实现
    初识MVC和KVC
    Xcode的常用快捷键
    UI基础--手写代码实现汤姆猫动画
    UI基础--UIView常见属性之frame、center、bounds、transframe属性
    UI基础--UIButton、懒加载
    ios多线程
    ios多线程简介
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8496954.html
Copyright © 2011-2022 走看看