题目
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 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);
}
}