题目来源
https://www.nowcoder.com/questionTerminal/d8acfa0619814b2d98f12c071aef20d4
题目描述
对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串。
给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串。
测试样例:
"(()())",6
返回:true
测试样例:
"()a()()",7
返回:false
测试样例:
"()(()()",7
返回:false
解题思路-栈实现
- 字符串合法性校验
String -> char[]
- 左括号入栈,右括号取出栈顶左括号与之匹配
- 结果:
-
- 有除括号之外的字符。返回
false
- 有除括号之外的字符。返回
-
- 第一个数组数据就是右括号。返回
false
- 第一个数组数据就是右括号。返回
-
- 左右括号顺序,多少刚好匹配。返回
true
- 左右括号顺序,多少刚好匹配。返回
-
- 左括号多,返回
false
- 左括号多,返回
实现代码
import java.util.*;
public class Title2 {
public static boolean chkParenthesis(String A, int n) {
Stack<Character> stack = new Stack<>(); //声明栈
if (n == 0 || A.length() != n) {
return false;
}
char[] array = A.toCharArray(); //string->char[]
int len = array.length;
for (int i = 0; i < len; i++) {
if (array[i] != '(' && array[i] != ')') { //出现处括号以外的东西,直接为flse
return false;
}
if (array[i] == '(') { //左括号入栈
stack.push(array[i]);
} else { //右括号
if (stack.empty()) { //结果1:右括号多
return false;
} else if (array[i] == ')') {
stack.pop();
}
}
}
if (!stack.empty()) { //左括号多
return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(chkParenthesis("()()(((())))", 12));
}
}