• 32.最长有效括号


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

    示例 1:

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

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

    方法一

     int longestValidParentheses(string s) {
            //start记录有效字串开始位置
            int res=0,start=0,n=s.size();
            stack<int> st;
            for(int i=0;i<n;++i){
                if(s[i]=='(') {
                    //st存储入栈左括号的位置
                    st.push(i);
                }
                else if(s[i]==')'&&st.size()){
                    st.pop();
                    //如果此时栈为空说明栈中的所有左括号已经配对
                    if(!st.size()){
                        res=max(res,i-start+1);
                    }
                    //有可能栈中的左括号没法全部配对,例如"((())"
                    else res=max(res,i-st.top());
                }
                //如果遇到右括号且栈中已无左括号,则重新设置start
                else{
                    start=i+1;
                }
            }
            return res;
     }
    

    方法二

    使用两个变量left和right,分别表示左右括号数量。从左向右遍历字符串,因为有效字符串左括号数量必定等于右括号数量,当right>left表明当前子串必定无效,此时令left=right=0从当前位置重新计数;当left=right时当前子串有效,更新res。有一个问题是像"(()"这样的没法更新res,解决方法是同样的方法从右往左再遍历一遍。

     int longestValidParentheses(string s) {
            int res=0,n=s.size(),left=0,right=0;
            for(int i=0;i<n;++i){
                (s[i]=='(')?left++:right++;
                if(right>left) left=right=0;
                else if(right==left) res=max(res,right*2);
            }
            left=0,right=0;
            for(int i=n-1;i>=0;--i){
                (s[i]=='(')?left++:right++;
                if(right<left) left=right=0;
                else if(right==left) res=max(res,left*2);
            }
            return res;
        }
    

    leetcode原题链接:https://leetcode-cn.com/problems/longest-valid-parentheses

  • 相关阅读:
    python文件句柄只能用一次的误解
    字符编码后续...记事本"联通"小插曲
    字符编码
    python problem
    vue-cli3 vue-config.js配置 概况
    ssh-keygen 不是内部或外部命令
    好的文章的链接收藏
    urlArgs 请require 缓存
    js 类型判断
    阻止冒泡和取消默认事件(默认行为)
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/13693629.html
Copyright © 2020-2023  润新知