public class BracketsCheckTest {
public static void main(String[] args) {
System.out.println(bracketsCheck("a((()){khgg{[]sdfg}gdfg}"));
System.out.println(bracketsCheck("}a((()){khgg{[]sdfg}gdfg}"));
System.out.println(bracketsCheck("a}((()){khgg{[]sdfg}gdfg}"));
System.out.println(bracketsCheck("a("));
}
/**
* 校验括号是否成对匹配
*
* 返回-1为正常,其余数字代表错误位置,从零开始索引
*
* @date 2018年11月22日 上午10:54:50
* @param checkedStr
* @return
*/
public static Integer bracketsCheck(String checkedStr) {
Stack<Character> bracketsStack = new Stack<>();
char[] chedkedCharArray = checkedStr.toCharArray();
for (int i = 0; i < chedkedCharArray.length; i++) {
char c = chedkedCharArray[i];
// 左括号都压入栈顶,右括号进行比对
if(c == '(' || c == '[' || c == '{') {
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;
}
}
}
// 结束后栈内为空则正常,否则返回字符串全长+1,表示有括号未结束
if(bracketsStack.isEmpty()) {
return -1;
} else {
return checkedStr.length() + 1;
}
}
}
执行结果
25
0
1
3