每日一练——最长连续有效括号

题目

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

示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”

示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”

示例 3:
输入:s = “”
输出:0

提示:0 <= s.length <= 3 * 104;s[i] 为 ‘(’ 或 ‘)’。

以下程序实现了这一功能,请你填补空白处内容:

import java.util.*;

class Solution {
	public int longestValidParentheses(String s) {
		int left = 0, right = 0, max = 0;
		for (int i = 0; i < s.length(); i++) {
			if (s.charAt(i) == '(')
				left++;
			else
				right++;
			if (left == right)
				max = Math.max(max, left * 2);
			if (right > left)
				left = right = 0;
		}
		left = 0;
		right = 0;
		for (int i = s.length() - 1; i >= 0; i--) {
			__________________;
			if (left == right)
				max = Math.max(max, left * 2);
			if (right < left)
				left = right = 0;
		}
		return max;
	}
}

选项

A

if (s.charAt(i) == '(')
	left++;
else
	right++;

B

if (s.charAt(i) == ')')
	right++;
else
	left++;

C

if (s.charAt(i) == '(')
	right++;
else
	left++;

D

if (s.charAt(i) == ')')
	left++;
else
	right++;

分析

1、首先理解题目:找出最长有效(格式正确且连续)括号子串的长度。
  关键:连续括号,意思指必须是这样的**“()()“连续括号,如中间有间隔”())()”,则实际上只能算一组"()“
2、第一个for循环
  第一个for循环最后一个if (right > left)判断的就是上述情况,如先出现right > left,则将left = right = 0,重新开始计数。之前出现过的连续括号已经由max记录。
注:这个for循环无法判断连续多个左括号,然后出现连续右括号的情况(左的数量大于右的数量),如
”((())"**。
3、第二个for循环
  关键:划线部分应该还是如第一个for中,是一个if-else判断。接着需要看最后的if判断,它是right < left,判断的情况是左括号大于右括号,而且for的循环条件为:int i = s.length() - 1; i >= 0; i–,是最后往前找的,所以这个for循环无法判断连续多个右括号,然后出现连续左括号的情况(右大于左)。

综上所述:答案为A或B。
因为A和B表达的是同一个意思。
但是CSDN上边回答时正确答案是A,可能是和自带的输入有关系吧。因为像牛客,LeetCode上边有一些是不需要你编写输入的,只需要写要求的方法就可以。

注:括号一左一右,从前往后找的时候,应该判断右括号比左括号多的情况,反之,从后往前找的时候,应该判断左括号比右括号多的情况。

如果上边的思路有误,请私信我,我会马上更改。

完整代码

当然代码用栈实现起来更方便,我偷懒只是Ctrl+c v了一下。

import java.util.Scanner;

public class Test {
    public static void main(String[] argss){
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();

        int left = 0,right = 0,max = 0;
        for (int i=0;i<s.length();i++){
            if (s.charAt(i)=='('){
                left++;
            }
            else {
                right++;
            }
            if(left==right){
                max=Math.max(max,left*2);
            }
            if(right>left){
                left=right=0;
            }
        }
        left=0;
        right=0;
        for (int i=s.length()-1;i>=0;i--){
            if (s.charAt(i)=='('){
                left++;
            }
            else {
                right++;
            }
            if(left==right){
                max=Math.max(max,left*2);
            }
            if(left>right){
                left=right=0;
            }
        }
        System.out.println(max);
    }
}
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值