Loading

Leetcode- 最长的括号子串(经典题变形)

题目链接


描述

给出一个长度为 n 的,仅包含字符 '(' 和 ')' 的字符串,计算最长的格式正确的括号子串的长度。

例1: 对于字符串 "(()" 来说,最长的格式正确的子串是 "()" ,长度为 2 .
例2:对于字符串 ")()())" , 来说, 最长的格式正确的子串是 "()()" ,长度为 4 .

思路

是经典题判断括号是否匹配的扩展。
可以用 栈 ,也可以用 贪心思想。

  1. 贪心:
    遍历 s ,记录一个最后不匹配的位置tmp, 初始为-1.
    L,R 分别记录‘(’ 和 ')' 出先的次数。
    当 R>L 时,一定时不匹配了,更新tmp为i,L=0,R=0.
    当 L == R 时,一定匹配了,ans = max(ans, i-tmp).
    只这样不行,像"(()"这种无法正确计算,所以要从后再遍历一遍。
    遍历 s ,记录一个最后不匹配的位置tmp, 初始为n.
    L,R 分别记录‘(’ 和 ')' 出先的次数。
    当 L>R 时,一定时不匹配了,更新tmp为i,L=0,R=0.
    当 L == R 时,一定匹配了,ans = max(ans, tmp-i).
  2. 栈:

代码一(贪心):

class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.size();
        int ans = 0;
        int tmp = -1, L = 0, R = 0;
        for (int i = 0; i < n; i++)
        {
            if (s[i]=='(') L++;
            else if (s[i]==')') R++;

            if (R > L) {
                L = 0, R = 0;
                tmp = i;
            } else if (R == L) 
                ans = max(ans, i-tmp);
        }
        tmp = n, L = R = 0;;
        for (int i = n-1; i >= 0; i--)
        {
            if (s[i]=='(') L++;
            else if (s[i]==')') R++;

            if (L > R) {
                L = 0, R = 0;
                tmp = i;
            } else if (R == L)
                ans = max(ans, tmp-i);
        }
        return ans;
    }
};

代码二(栈):


posted @ 2022-03-18 14:17  ARUI丶  阅读(143)  评论(0编辑  收藏  举报