zoukankan      html  css  js  c++  java
  • 32. Longest Valid Parentheses

    一、题目

      1、审题

      

      2、分析:

        一个只包含‘(‘、’)’的字符串,求其中正确闭合的子串的最大长度。

    二、解答

      1、思路:

        方法一:

          从第一个字符开始遍历,依次求出从遍历的字符开始的最长闭合的字符串长度,从而记录最长闭合的字符串长度。

    class Solution {
        public int longestValidParentheses(String s) {
    
            int slen = s.length();
            if (slen == 0)
                return 0;
    
            int maxLen = 0;
            for (int i = 0; i < slen - 1 - maxLen; i++) {  // 从第一个字符开始,依次遍历
                int count = 1;                // 记录是否闭合
                if(s.charAt(i) == ')')
                    continue;
                int tmpLen = 0;  
                int leftLen = 1;          // '(' 的个数
                for (int j = i+1; j < slen; j++) {
                    if(s.charAt(j) == '(') {  
                        count++;
                        leftLen++;
                    }
                    else {
                        count--;
                    }
                    if(count < 0)
                        break;
                    if(count == 0)  
                        tmpLen = leftLen * 2;
    
                }
    
                if(tmpLen > maxLen)
                    maxLen = tmpLen;
            }
            return maxLen;
        }
    }

      

      方法二:

        用 Stack 存放 '(' 的下标,碰到 ‘)’只需要栈顶减去此时的下标即为与此‘)’匹配的子串长度,同时对每一个闭合的子串长度加以记录,统计出最大的字符串长。

    public class Solution {
        public int longestValidParentheses(String s) {
            Stack<Integer> stack = new Stack<Integer>();
            int target = 0;
            int  left = -1;   // 记录 '(' 的下标
    
            for(int i = 0; i < s.length(); i++){
                if(s.charAt(i) == '(')
                    stack.push(i);
                else {
                    if(stack.isEmpty()){
                        left = i;
                    }else {
                        stack.pop();
                        if(stack.isEmpty()) target = Math.max(target, i - left);
                        else                target = Math.max(target, i - stack.peek());
                    }
                }
                
            }
            return target;
        }
    }            
  • 相关阅读:
    P1032 字串变换
    P3203 [HNOI2010]弹飞绵羊
    P3690 【模板】Link Cut Tree (动态树)
    P2147 [SDOI2008]洞穴勘测
    P3950 部落冲突
    Codeforces Round #469 Div. 2题解
    线段树
    SDOI2018退役记
    4.1模拟题
    无旋Treap
  • 原文地址:https://www.cnblogs.com/skillking/p/9440152.html
Copyright © 2011-2022 走看看