有效的括号(四 | 9.1)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
思路:
-
导入必要的包:
import java.util.Stack;这里导入了Java的
Stack类,用于实现栈数据结构。 -
创建
isValid方法:public boolean isValid(String s) {这个方法接受一个字符串
s作为输入,并返回一个布尔值,表示字符串是否包含有效的括号匹配。 -
创建一个栈来存储左括号:
Stack<Character> stack = new Stack<>();在这里,我们创建了一个
Stack对象,用于存储字符类型的元素,即左括号。 -
遍历字符串的每个字符:
javaCopy code for (char c : s.toCharArray()) {我们使用
for-each循环遍历输入字符串s中的每个字符。 -
如果字符是左括号,将其压入栈中:
if (c == '(' || c == '{' || c == '[') { stack.push(c); }如果当前字符是
'('、'{'或'['中的任意一个,那么它是一个左括号,我们将其压入栈中。 -
如果字符是右括号,检查栈是否为空:
else { if (stack.isEmpty()) { return false; // 没有对应的左括号 } }如果当前字符是右括号,我们首先检查栈是否为空,如果栈为空,说明没有对应的左括号,因此字符串无效,返回
false。 -
弹出栈顶元素并检查是否匹配:
char top = stack.pop(); if (c == ')' && top != '(' || c == '}' && top != '{' || c == ']' && top != '[') { return false; // 括号不匹配 }如果栈不为空,我们从栈中弹出栈顶元素,并检查当前右括号字符与弹出的左括号是否匹配。如果它们不匹配,说明括号不正确闭合,返回
false。 -
最后,检查栈是否为空:
return stack.isEmpty();如果在遍历完整个字符串后,栈为空,说明所有括号都正确闭合,返回
true,否则返回false。
在 main 方法中,我们使用了示例字符串 s1 和 s2 进行测试,以验证isValid方法的功能。
import java.util.Stack;
public class ValidParentheses {
public boolean isValid(String s) {
// 创建一个栈来存储左括号
Stack<Character> stack = new Stack<>();
// 遍历字符串的每个字符
for (char c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
// 如果是左括号,将其压入栈中
stack.push(c);
} else {
// 如果是右括号,检查栈是否为空
if (stack.isEmpty()) {
return false; // 没有对应的左括号
}
// 弹出栈顶元素,检查是否匹配
char top = stack.pop();
if (c == ')' && top != '(' ||
c == '}' && top != '{' ||
c == ']' && top != '[') {
return false; // 括号不匹配
}
}
}
// 最后检查栈是否为空,如果为空说明所有括号都正确闭合
return stack.isEmpty();
}
public static void main(String[] args) {
ValidParentheses solution = new ValidParentheses();
String s1 = "([{}])"; // 有效字符串
String s2 = "([)]"; // 无效字符串
System.out.println(solution.isValid(s1)); // 输出 true
System.out.println(solution.isValid(s2)); // 输出 false
}
}