public static void main(String[] args) {
String a = "vab(c {a[d]}sa)";
Integer d = bracketsMatchedSearch(a.toCharArray(), 5);
System.out.println(d);
}
/**
* 得到匹配括号的位置
*
* 返回对应坐标为正常,
* -1表示传进来的坐标不是左括号也不是空格,是空格会顺位向后匹配直到遇到左括号
* -2表示不存在对应右括号(不应该出现,应该提前校验过括号配对)
*
* @date 2018年11月22日 上午10:54:50
* @param checkedStr
* @return
*/
public static Integer bracketsMatchedSearch(char[] checkedCharArray, int leftIndex) {
// 校验传进来的数组和索引是否为合法
if(checkedCharArray.length < leftIndex) {
return -1;
}
char left = checkedCharArray[leftIndex];
// 非左括号
if(!('(' == left || '[' == left || '{' == left)) {
// 如果是空格则+1
if(' ' == left) {
return bracketsMatchedSearch(checkedCharArray, leftIndex + 1);
} else {
return -1;
}
}
/*
* 获取传进来的是第几个左括号
*/
int index = 0;
Matcher matcher = Pattern.compile("\\(|\\[|\\{").matcher(new String(checkedCharArray));
while(matcher.find()) {
index++;
if(matcher.start() == leftIndex) {
break;
}
}
/*
* 获取另一配对括号位置
*/
Stack<Character> bracketsStack = new Stack<>();
int count = 0;
for (int i = 0; i < checkedCharArray.length; i++) {
char c = checkedCharArray[i];
// 左括号都压入栈顶,右括号进行比对
if(c == '(' || c == '[' || c == '{') {
count++;
// 如果是目标,就插入*作为标记
if(index == count) {
bracketsStack.push('*');
} else {
bracketsStack.push(c);
}
} else if(c == ')') {
// 栈非空校验,防止首先出现的是右括号
if(bracketsStack.isEmpty()) {
return i;
}
Character popChar = bracketsStack.pop();
if('*' == popChar) {
return i;
}
} else if(c == ']') {
if(bracketsStack.isEmpty()) {
return i;
}
Character popChar = bracketsStack.pop();
if('*' == popChar) {
return i;
}
} else if(c == '}') {
if(bracketsStack.isEmpty()) {
return i;
}
Character popChar = bracketsStack.pop();
if('*' == popChar) {
return i;
}
}
}
return -2;
}
执行结果
11