leetcode32.最长有效括号(栈+DP)C++

刷这道题主要是练习栈和动态规划
上原题:
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
栈:
刚看到这道题能明显想到栈,学数据结构中的栈时常见有效括号这类题。这里维护一个栈,pos一直记录第一个有效左括号位置(无效的话移动pos),栈中存放左括号下标(不知道是否有效)。右括号遇到就pop。栈为空则有效,res=i-pos。栈不为空,则res=i-p.top();
具体代码如下:

int longestValidParentheses(string s) {
        int result = 0,pos = -1; //只能是-1;   
        stack<int> p;//栈
        for (int i = 0;i < s.size();i++){
            if (s[i] == '(')    //遇到左括号就压栈
                p.push(i);
            else if (p.empty())    //没有左括号时(只有右括号或者有效括号已经pop)移动pos。           
                pos = i;
            else{
                p.pop();    //匹配后出栈。res
                result = p.empty() ? max(result,i-pos) : max(result,i-p.top());//判断是否为空,空的话i-pos;否则i-p.top();
            }
        }
        return result;

动态规划:
刚看到这道题能明显想到动态规划(其实哪个都想不到,看过答案后才想到的)。转移方程为dp[i]=dp[i-1]+2。最后还应该加上前边(pos-1)的有效括号
直接上代码,看注释即可:

int longestValidParentheses(string s) {
        int result = 0;
        vector<int> dp(s.size());    //dp数组
        for (int i = 1;i < s.size();i++){
            if (s[i] == ')'){    //是右括号进行判断匹配
                int pos = i-dp[i-1]-1;    //减去前边的有效括号,到达前边的位置。
                if (pos >= 0 && s[pos] == '('){    //匹配上的话就出现一对新的括号。
                    dp[i] = dp[i-1]+2;    //+2
                    if (pos-1 > -1)       //该判断防止越界
                        dp[i]+=dp[pos-1];//对前边的括号进行判断,也是有效括号的话加在一起。不是的话dp[pos-1]=0;
                    result = max(dp[i],result);//每次取max;
                }
            }
        }
        return result;

你可能感兴趣的:(leetcode刷题)