作者 : Xia Xinyu
日期 : 2022-1-3原题链接
一个合法的括号序列满足以下条件:
序列()被认为是合法的。
如果序列X与Y是合法的,则XY也被认为是合法的。
如果序列X是合法的,则(X)也是合法的。
例如,(),()(),(())这些都是合法的。
现在,给定一个由 ( 和 ) 组成的字符串。
请你求出其中的最长合法括号子序列的长度。
注意,子序列不一定连续。
输入格式
共一行,一个由 ( 和 ) 组成的字符串。
输出格式
一个整数,表示最长合法括号子序列的长度。
数据范围
前五个测试点满足, 1≤输入字符串的长度≤10。
所有测试点满足,1≤输入字符串的长度≤106。
输入样例1:
(()))(
输出样例1:
4
输入样例2:
()()(()(((
输出样例2:
6
思路:刚开始想复杂了,其实是很简单的一道题,使用双指针算法迎刃而解
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String s = in.next();
int ans = 0;
for(int i = 0;i < s.length(); i ++){
int j = i;
int cnt = 0; //记录左括号数量
while(j < s.length()){
if(s.charAt(j) == '(')
cnt ++;
if(cnt != 0 && s.charAt(j) == ')'){
//只要cnt不等于0,那么一定存在一个左括号与当前右括号匹配
cnt --;
ans += 2;
}
if(cnt < 0) break;
j ++;
}
i = j;
}
System.out.println(ans);
}
}
时间复杂度
:O(n) n为字符串长度
空间复杂度
:O(n)