版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
这道题是我从同学那里听来的,所以没法测验我的算法对不对,不过我试的用例都过了。时间复杂度O(n)。
一个字符串由中括号和小括号组成,问其中最长有效括号对是从哪里到哪里
例如
输入:()(([]))([)]
输出:0 7
import java.util.*;
public class Niuke0418 {
public static void main(String[] args) {
String str = "()(([]))([)]";
char[] a = str.toCharArray();
int[] res = fun(a);
}
public static int[] fun(char[] a){
int[] mem = new int[a.length];
for(int i = 0; i < a.length; ++i){
if(a[i] == '('){
}else if(a[i] == '['){
}else if(a[i] == ')'){
if(i - 1 >= 0){
if(a[i - 1] == '('){
if(i - 2 >= 0){
mem[i] = mem[i - 2] + 1;
}else{
mem[i] = 1;
}
}else if(a[i - 1] == ')' || a[i - 1] == ']'){
int index = i - mem[i - 1] * 2 - 1;
if(index >= 0){
if(a[index] == '('){
mem[i] = mem[i - 1] + 1;
if(index - 1 >= 0){
mem[i] += mem[index - 1];
}
}
}
}else if(a[i - 1] == '['){
}else{
}
}else{
}
}else if(a[i] == ']'){
if(i - 1 >= 0){
if(a[i - 1] == '['){
if(i - 2 >= 0){
mem[i] = mem[i - 2] + 1;
}else{
mem[i] = 1;
}
}else if(a[i - 1] == ')' || a[i - 1] == ']'){
int index = i - mem[i - 1] * 2 - 1;
if(index >= 0){
if(a[index] == '['){
mem[i] = mem[i - 1] + 1;
if(index - 1 >= 0){
mem[i] += mem[index - 1];
}
}
}
}else if(a[i - 1] == '('){
}else{
}
}else{
}
}
}
int max = 0;
int[] res = new int[2];
for(int i = 0; i < mem.length; ++i){
if(max < mem[i]){
max = mem[i];
res[0] = i - mem[i] * 2 + 1;
res[1] = i;
}
}
return res;
}
}