其他分享
首页 > 其他分享> > 最长有效括号

最长有效括号

作者:互联网

 

 

详细思路 左括号放进去,右括号的话,和栈顶的左括号匹配,匹配时,如果为空,说明其实是不能匹配的,不用更新答案,但要把这个右括号作为新的栈底,如果没空,说明之前的匹配成功,计算   精确定义 i需要检测的元素 栈底:最后一个没有被匹配的右括号下标或者-1 栈顶:可以匹配的左括号下标
class Solution {
public:
    int longestValidParentheses(string s) {
        int ans=0;
        int n=s.size();
        stack<int>stk;
        stk.push(-1);
        for(int i=0;i<n;i++){
            if(s[i]=='(')stk.push(i);
            else if(s[i]==')'){
                stk.pop();
                if(stk.empty())stk.push(i);
                else ans=max(ans,i-stk.top());
            }
        }
        return ans;
    }
};
踩过的坑 利用好栈底,如果pop后为空,说明来到了栈底,你想要把什么放进栈底?    

详细思路

前i个,以i结尾的子串,有某种递推关系   精确定义 dpi 第0个元素到第i个元素的子串,以i结尾的有效括号最长长度 i需要判断的字符串下标   递推 - - ( )  dp i =dp i-2   +2 - ( (  ) ) dp i =dp[i-1]+2+dp[i-dp[i-1]-2]   解释:如果遇到)),同时s[i-dp[i-1]-1]==(,有   (())看出dp[i-1]+2,-看出dp[i-dp[i-1]-2]   初始化 dp 0=0
class Solution {
public:
    int longestValidParentheses(string s) {
        int n=s.size();
        if(n<2)return 0;
        vector<int>dp(n);
        dp[0]=0;
        int ans=0;
        for(int i=1;i<n;i++){
            if(s[i]==')'&&s[i-1]=='(')dp[i]=(i-2>=0?dp[i-2]:0)+2;
            else if(s[i]==')'&&s[i-1]==')'&&i-dp[i-1]-1>=0&&s[i-dp[i-1]-1]=='('){
                dp[i]=dp[i-1]+2+(i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0);
            }
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

 

踩过的坑 所有dp+string的题,最好dp0是第0个数,而不是空字符,然后空字符用 i-1>=0?dp[i-1]:0;

标签:匹配,有效,int,栈底,括号,ans,最长,dp
来源: https://www.cnblogs.com/zhouzihong/p/15067195.html