图片说明

  • import java.util.Stack;
    class Solution {
      // 最长字串 而非符合的有效括号
    
      // 一开始是通过匹配()())( 有多少对是满足条件的
          //出现问题 如何去识别哪段子串是最长 没法确定 因为算到最后是整个括号字符串有多少个匹配
          //( 左括号 容易卡在栈里面 可能到最后还没能pop出来
      //解决方案
          //https://www.bilibili.com/video/av66667898/
          //栈不再是保存字符了 而是保存下标 代码如下
      public int longestValidParentheses(String s) {
          char c[] = s.toCharArray();
          int n = c.length;
          int ans = 0;
          int count = 0;
          Stack<Integer> stack = new Stack<Integer>();
          stack.add(-1);
          for (int i = 0; i < n; i++) {
              if (c[i] == '(') {
                  stack.add(i);
              }
              else {
                  stack.pop();
                  if(stack.size()==0)stack.add(i);
                  else {
                      count  = i - stack.peek();//不用pop出来 留给下一轮再pop
                  }
                  ans = Math.max(count,ans);
              }
          }
          return ans ;
      }
    }
  • 大雪菜的解法

    //y总的解法
      // 括号序列合法 <==> 前缀和 >= 0 且 总和等于0
      // start 枚举的这一段的开头
      // cnt 前缀和
      // 1. cnt < 0 -> start = i , cnt = 0;
      // 2. cnt > 0 -> 继续做
      // 3. cnt == 0 -> [start , i]是一段合法的括号序列
      public int work(char c[]) {
          int start = 0;
          int cnt = 0;
          int ans = 0;
          for (int i = 0; i < c.length; i++) {
              if (c[i] == '(')
                  cnt++;
              else {
                  cnt--;
                  if (cnt < 0) {
                      start = i + 1;
                      cnt = 0;
                  }
                  else if(cnt==0)ans = Math.max(ans, i - start + 1);
              }
          }
          return ans;
      }
    
      public int longestValidParentheses(String s) {
          char c[] = s.toCharArray();
          int res = work(c);
          char c1[] = s.toCharArray();
          for(int i = 0; i < c.length ; i++) {
              c1[i] = c[c.length-1-i];
              c1[i]^=1;
          }
    
          return Math.max(res, work(c1));
      }
    }