一个字符串中可能出现
[]
()
和{}
三种括号,判断该括号是否有效
有效的例子
()[]{}
([{}])
()
无效的例子
[)
([)]
([]
((
思路:
遇到左括号, 把要配对的右括号放入栈顶
遇到右括号, 若此时栈为空, 返回 false,否则把它与栈顶元素对比
若相等, 栈顶元素弹出, 继续对比下一组
若不等, 无效括号直接返回 false
循环结束
若栈为空, 表示所有括号都配上对, 返回 true
若栈不为空, 表示右没配对的括号, 应返回 false
答案(用到了"栈"案例中的 ArrayStack 类)
如果需要 ArrayStack 类,请访问本作者的“栈的初步认识”:
或者进入链接获取相关代码:
GitHub - 1693905917/DataStructure: 数据结构与算法
public boolean isValid(String s) {
ArrayStack<Character> stack = new ArrayStack<>(s.length() / 2 + 1);
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//遇到左括号, 把要配对的右括号放入栈顶
if (c == '(') {
stack.push(')');
} else if (c == '[') {
stack.push(']');
} else if (c == '{') {
stack.push('}');
} else {//遇到右括号, 若此时栈为空, 返回 false,否则把它与栈顶元素对比
//!stack.isEmpty():为了防止用户输入的字符都是右括号的字符(比如:"((" ) 那么我们stack就会报空指针异常
if (!stack.isEmpty() && stack.peek() == c) { //* 若相等, 栈顶元素弹出, 继续对比下一组
stack.pop();
} else {
return false;//若不等, 无效括号直接返回 false
}
}
}
//* 若栈为空, 表示所有括号都配上对, 返回 true
//若栈不为空, 表示右没配对的括号, 应返回 false
return stack.isEmpty();
}
测试案例:
/*
( [ ]
底 - 栈 - 顶
)
遇到左括号, 把要配对的右括号放入栈顶
遇到右括号, 把它与栈顶元素对比
若相等, 栈顶元素弹出, 继续对比下一组
若不等, 无效括号直接返回 false
*/
public static void main(String[] args) {
E01LetCode20 s = new E01LetCode20();
System.out.println(s.isValid("([{}])"));
System.out.println(s.isValid("()[]{}"));
System.out.println(s.isValid("()"));
System.out.println("---------------------");
System.out.println(s.isValid("[)"));
// ]
System.out.println(s.isValid("([)]"));
// ) ]
System.out.println(s.isValid("([]"));
// )
System.out.println(s.isValid("("));
System.out.println("---------------------");
System.out.println(s.isValid(")("));
System.out.println(s.isValid("]"));
}