题解 | #最长的括号子串#

最长的括号子串

http://www.nowcoder.com/practice/45fd68024a4c4e97a8d6c45fc61dc6ad

1.栈

用栈保存最近未匹配括号的下标,将栈初始化为{-1}。 只有当前字符s[i]为')'且未匹配括号为'('时,弹出栈顶元素,并更新匹配括号子串的最大长度。 否则就将当前括号的下标进栈。

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        if(s.empty()) return 0;
        int n = s.size();
        stack<int> st;
        st.push(-1);
        int res = 0;

        for(int i = 0; i < n; i++){
            if(s[i] == ')' && !s.empty() && s[st.top()] == '('){
                st.pop();
                res = max(res, i - st.top());
            }else{
                st.push(i);
            }
        }
        return res;
    }
};

2.动态规划

用dp[i]保存s[0...i]这个字符串的最长匹配括号。

当s[i]为左括号时,dp[i] = 0;

只有当s[i]为右括号')', i-1前面的最长匹配部分的前一个位置 i-dp[i-1]-1为'(', 对dp[i]进行更新:

dp[i] = dp[i-1] + 2 + dp[i - dp[i-1]- 2]

alt

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        if(s.empty()) return 0;
        int n = s.size();
        vector<int> dp(n);
        int res = 0;
        for(int i = 1; i < n; i++){
            if(s[i] == ')' &&  i- dp[i-1] > 0 && s[i - dp[i-1] - 1] == '('){
                dp[i] = dp[i-1] + 2;
                if(i-dp[i-1]-2 >= 0){
                    dp[i] += dp[i-dp[i-1]-2];
                }
            }
            res = max(res, dp[i]);
        }
        return res;
    }
};

全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务