题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
链接:有效的括号.
示例
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
解题过程
我首先想到的解法是:将({[放在一起组成一个新字符串,再将)}]组成另外一个字符串。然后对字符串s里的每一个字符进行判断,在这两个新字符串中是否能找到。但是这种方法真的麻烦,我最后没写出来。因为{[]}和{}[]这两种真的情况在我的算法里没法同时满足。然后就在讨论区看到了大佬的回答,简洁明了,贴上来学习一下。
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''
查了百度知道,java的String类里面也有replace方法,将大佬的改成java试了试,发现一个问题,经过replace之后,字符串s并不是空,返回的依然是false。然后我就改成了判断s.length() == 0,就可以了,奇奇怪怪。
哦哦,我发现了,字符串的内容是否相等应该用s.equals()。
class Solution {
public boolean isValid(String s) {
while((s.indexOf("{}") + s.indexOf("[]") + s.indexOf("()")) > -3){
s = s.replace("{}", "");
s = s.replace("()", "");
s = s.replace("[]", "");
}
if (s.equals("")) return true;
else return false;
}
}
这道题其实还有许多的知识盲区,比如官方题解中给出的栈的解法。我能回想起关于栈的知识,无非就是先进后出。
栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈。有了链表的加持,这道题目就迎刃而解了。因为还没实现过数据结构,所以就不在博客里分析了,大神解题思路指路:栈的解法