栈
首先,我们定义一个isValid
方法,该方法接受一个字符串s
作为参数,并返回一个布尔值来表示该字符串是否有效。
public boolean isValid(String s) {// 如果字符串为空,则自然是有效的if (s.isEmpty())return true;// 创建一个栈,用于存储遍历过程中遇到的左括号Stack<Character> stack = new Stack<>();// 遍历字符串中的每个字符for (char c : s.toCharArray()) {// 如果字符是左括号('('、'{' 或 '[')if (c == '(')stack.push('('); // 将左括号压入栈中else if (c == '{')stack.push('{'); // 将左括号压入栈中else if (c == '[')stack.push('['); // 将左括号压入栈中// 如果字符是右括号(')'、'}' 或 ']')else {// 检查栈是否为空,如果为空,说明没有匹配的左括号,返回falseif (stack.isEmpty())return false;// 弹出栈顶的左括号,并与当前右括号进行比较char top = stack.pop();// 如果左右括号不匹配,返回falseif (c != getClosingBracket(top))return false;}}// 如果循环结束后栈为空,说明所有括号都匹配成功,返回true// 如果栈不为空,说明有未匹配的左括号,返回falsereturn stack.isEmpty();
}
在上面的代码中,我们使用了一个辅助方法getClosingBracket
,它接收一个左括号字符作为参数,并返回对应的右括号字符。
// 辅助方法,用于根据左括号返回对应的右括号
private char getClosingBracket(char openingBracket) {if (openingBracket == '(')return ')';else if (openingBracket == '{')return '}';else if (openingBracket == '[')return ']';else// 如果不是左括号,返回一个特殊字符(这里使用'\0',但通常不会执行到这一分支)return '\0';
}
在isValid
方法中,我们首先检查字符串是否为空,如果为空,则自然是有效的,直接返回true
。
接下来,我们创建了一个栈,用于存储遍历过程中遇到的左括号。
然后,我们遍历字符串中的每个字符。对于每个字符,我们检查它是否是左括号。如果是左括号,我们将其压入栈中。如果字符是右括号,我们首先检查栈是否为空。如果栈为空,说明没有匹配的左括号,返回false
。如果栈不为空,我们弹出栈顶的左括号,并使用getClosingBracket
方法获取对应的右括号,然后与当前的右括号进行比较。如果它们不匹配,也返回false
。
最后,在循环结束后,我们检查栈是否为空。如果栈为空,说明所有括号都匹配成功,返回true
。如果栈不为空,说明还有未匹配的左括号,返回false
。
整个流程就是通过遍历字符串,使用栈来辅助匹配括号,最终判断字符串是否有效。