leetcode 困难 —— 最长有效括号(超详细思路)

(感觉力扣的困难好迷,有时候需要特别巧的思路,有时候又是很简单的题)

题目:
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

题解:
注意题目上说的连续,我们应该怎么考虑呢

每个 “)” 匹配到前面一个 “(” 就可以把对应的这两个删了,因为这两个也不会影响之后的 “)” 匹配,而且每次匹配,中间一定是连续的(要么原本就是贴着的,要么就是中间的是匹配的删了)

然后每次匹配的时候,判断一下当前连续字符串的长度即可
长度 = 当前匹配的 “)” 的索引 - “(” 的前面一个没删掉的括号的索引
(为什么不是减去上一个 “(” 的索引呢,因为存在情况 “()()”,这样的话就只能得到 2)

为了方便计算,我们可以在最前面添加一个 “)”,索引为 -1,因为这不肯定不会匹配,所以不会影响结果,例 “)()()”
这个时候我们匹配最后两个括号 “()” 就是索引 3 - (-1) (索引从 -1 开始,写成从 0 开始当然也行)

代码如下:

class Solution {
public:
    vector<pair<bool, int> > ddd;
    int longestValidParentheses(string s) {
        int res = 0;
        ddd.push_back(make_pair(true, -1));
        for(int i = 0; i < s.size(); i++) {
            if(s[i] == '(') ddd.push_back(make_pair(false, i));
            else ddd.push_back(make_pair(true, i));
        }
        for(int i = 2; i < ddd.size(); i++) {
            if(ddd[i].first && !ddd[i - 1].first) {
                res = max(res, ddd[i].second - ddd[i - 2].second);
                ddd.erase(ddd.begin() + i - 1, ddd.begin() + i + 1);
                i = i - 2;
            }
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_52212261/article/details/128890585