Java算法题-解析 "有效的括号" 算法问题
题目:
给定一个只包含字符 '('
,')'
,'{'
,'}'
,'['
和 ']'
的字符串 s
,判断字符串中的括号是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
引言:
"有效的括号" 是一个字符串处理问题,要求判断字符串中的括号是否有效。解决这个问题需要对字符串和栈的操作有深刻理解,同时需要注意括号的匹配和顺序。通过解答这个问题,我们可以提升对字符串处理、栈的应用,同时也能拓展对括号匹配问题的思考。
算法思路:
我们可以使用栈来解决这个问题。具体思路如下:
- 创建一个栈,用来存储左括号。
- 遍历字符串中的每个字符,对于每个字符
c
,如果是左括号('('
,'{'
,'['
),则将其压入栈中。 - 如果是右括号(
')'
,'}'
,']'
),则检查栈是否为空,若为空,说明右括号无法匹配,返回false
。 - 如果栈不为空,则取出栈顶的左括号,检查是否与当前右括号匹配,如果不匹配,返回
false
。 - 遍历完字符串后,如果栈为空,则说明所有括号都匹配,返回
true
。
代码实现:
以下是使用 Java 实现的 "有效的括号" 算法的示例代码:
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();
}
}
算法分析:
- 时间复杂度:需要遍历字符串中的每个字符,所以时间复杂度为 O(n),其中 n 是字符串的长度。
- 空间复杂度:需要使用栈来存储左括号,栈的最大空间可能为 n/2,所以空间复杂度为 O(n)。
示例和测试:
假设给定字符串为 "{[()]}"
,根据算法,这个字符串中的括号是有效的。
我们可以使用以下代码进行测试:
public class Main {
public static void main(String[] args) {
ValidParentheses solution = new ValidParentheses();
String s = "{[()]}";
boolean isValid = solution.isValid(s);
System.out.println("Is valid: " + isValid);
}
}
总结:
"有效的括号" 算法问题要求判断给定字符串中的括号是否有效,是一个考察字符串处理和栈的问题。通过实现这个算法,我们可以提升对字符串处理、栈的应用,同时也能拓展对括号匹配问题的思考。这个问题强调了在解决编程难题时,如何使用栈来处理括号匹配问题,以及对栈操作的熟练程度的重要性。