一、题目描述
二、思路分析
2.1 分析
本题是判断给的字符串包含的括号是否有效。
- 第一种做法是一旦发现字符串有正确的括号出现,立马用空串取代。如果字符串最后为空,说明字符串包含的括号是有效的。但这样做的效率非常低下,对内存和时间都有很大影响,仅供参考。
- 第二种做法是利用栈的先进后出的特点。遍历字符串的每个字符,如果遇到左半边的括号('('、'['、'{'),将其入栈。如果遇到右半边的括号(')'、']'、'}'),将当前栈顶的括号出栈。如果发现栈为空或者不匹配,直接返回 false。如果匹配,接着遍历字符串的下一个字符。最后字符串遍历完毕且栈为空,说明所有的括号都匹配。
2.2 图解
- 参考 Krahets有效的括号
三、题解
有效的括号的实现
- 做法一
class Solution {
public boolean isValid(String s) {
while (s.contains("()") || s.contains("{}")
|| s.contains("[]")) {
s = s.replace("()", "");
s = s.replace("{}", "");
s = s.replace("[]", "");
}
return s.isEmpty();
}
}
- 做法二
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
// 取出每一个字符
char ch = s.charAt(i);
// 取出的字符是左半边括号,入栈
if (ch == '(' || ch == '[' || ch == '{') {
stack.push(ch);
}
// 取出的字符是右半边括号
if (ch == ')' || ch == ']' || ch == '}') {
// 当前栈是空的,说明没有匹配
if (stack.isEmpty()) {
return false;
}
// 栈不为空,将当前栈顶括号出栈
char top = stack.pop();
// 出现不匹配
if (ch == ')' && top != '(') {
return false;
}
if (ch == ']' && top != '[') {
return false;
}
if (ch == '}' && top != '{') {
return false;
}
}
}
return stack.isEmpty();
}
}