[LeetCode] #20 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
输入:s = "()[]{}"
输出:true
输入:s = "([)]"
输出:false
输入:s = "{[]}"
输出:true
看到这道题目,让我想到了之前的[LeetCode] #13 罗马数字转整数
因为这两道题目都要分析一串有一定规则的字符串,所以我再次使用了替换法。
首先,我们需要看有效的字符串有什么共同点。可以发现一个有效的字符串至少会有一组相邻的括号。
然后,我们将这些相邻的括号去掉(替换为“”),会发现部分不相邻的一组括号相邻了。反复如此,最终字符串变成了空串。
而无效字符串会在这个过程中找不到相邻的一组括号。
class Solution { public boolean isValid(String s) { int length = s.length() / 2; for (int i = 0; i < length; i++) { s = s.replace("()", "").replace("{}", "").replace("[]", ""); } return s.length() == 0; } }
这个解法虽然挺简洁,但耗时较长。翻找评论区找到了一个低耗时的解法。
栈的特性完美的契合了题目
class Solution { public boolean isValid(String s) { Stack<Character>stack = new Stack<Character>(); for(char c: s.toCharArray()){ if(c=='(')stack.push(')'); else if(c=='[')stack.push(']'); else if(c=='{')stack.push('}'); else if(stack.isEmpty()||c!=stack.pop())return false; } return stack.isEmpty(); } }
知识点:
stack.pop() 和 stack.peek()
相同点:大家都返回栈顶的值。
不同点:peek 不删除栈顶的值,pop会把栈顶的值删除。
总结:有的时候,可以思考题目是否满足了某个数据结构的特性