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

最长的括号子串

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

双指针,正反(一个合法断里面的前缀or后缀)
class Solution {
public:
    int longestValidParentheses(string s) {
        int l = 0, r = 0, ans = 0;
        for(int i = 0; i < s.size(); i ++) {
            if(s[i] == '(')  l ++;
            if(s[i] == ')')  r ++;
            if(l == r) ans = max(ans, l + r);
            else if(r > l) l = r = 0;
        }
        l = r = 0;
        for(int i = s.size()-1; i >= 0; i --){
            if(s[i] == ')') r ++;
            if(s[i] == '(') l ++;
            if(r == l) ans = max(ans, l + r);
            else if(l > r) l = r = 0;
        }
        return ans;
    }
};
DP
class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> f(s.size()+1, 0);
        int ans = 0;
        for (int i = 1; i < s.size(); i ++){
            if(s[i] == '(') continue;

            if(s[i-1] == '(') f[i] = (i>=2 ? f[i-2] : 0) + 2;
            else if(s[i-f[i-1]-1] == '(') f[i] = f[i-1] + (i-f[i-1]-2>=0?f[i-f[i-1]-2]:0) + 2;
            ans = max(ans, f[i]);
        }
        return ans;
    }
};
栈(加一个特殊值卡住每一段)
class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> stk; stk.push_back(-1);
        int ans = 0;
        for(int i = 0; i < s.size(); i ++){
            if(s[i] == '('){
                stk.push_back(i);
            }else {
                if(stk.size() == 1){
                    stk.pop_back();
                    stk.push_back(i);
                }else {
                    stk.pop_back();
                    ans = max(ans, i - stk.back());
                }
            }
        }
        return ans;
    }
};
#美团笔试#
全部评论

相关推荐

04-06 11:24
已编辑
太原学院 C++
点赞 评论 收藏
分享
三题看不懂四题不明白二题无法AC&nbsp;T=int(input())&nbsp;for&nbsp;_&nbsp;in&nbsp;range(T):&nbsp;n=int(input())&nbsp;s=input().split()&nbsp;k,mx=1,1&nbsp;for&nbsp;i&nbsp;in&nbsp;range(len(s)-1):&nbsp;if&nbsp;len(s[i])&lt;len(s[i+1]):&nbsp;k+=1&nbsp;elif&nbsp;len(s[i])==len(s[i+1]):&nbsp;if&nbsp;s[i]&lt;=s[i+1]:&nbsp;k+=1&nbsp;...
恭喜臭臭猴子:第二题用栈就行。合法的括号直接出栈了,剩下的是不合法的,肯定都得一个一个走。出入栈的过程中得记下进栈的括号的下标。最后栈里剩下的括号如果相邻两个的下标不连续,说明它们中间有一个合法的括号序列被出栈,结果加一
投递拼多多集团-PDD等公司10个岗位 > 拼多多求职进展汇总 笔试
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务