题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
备注:这里的题目中“以正确的顺序”闭合的意思是先闭合完一组再去闭合另一组,我开始没有理解了这个以正确的顺序闭合,就导致我被卡在了这个用例上:
以正确顺序闭合的正确例子:
(){}[]或者[{()}]
不能括号匹配一半去匹配大括号
解题:
方法一:replace函数
通过不停的循环,把字符串中的(){}[]都去除掉,如果去除完之后的字符串长度是0 ,就证明这个字符串是符合条件的,是全部可以匹配的。其中还可以优化一部分:当一个字符串的长度是奇数的时候,它一定是无法全部匹配的,我们可以根据这一点筛掉一部分数据
class Solution {
public boolean isValid(String s) {
while(true){
int l=s.length();
s=s.replace("()","");
s=s.replace("{}","");
s=s.replace("[]","");
if(s.length()==l) //这一步是配合l=s.length()判断消之前和消之后长度有没有变化,没有变化就说明已经消完了
return l==0;
}
}
}
方法二:栈
前面提到,这个顺序是消完一对再消一对,那么我们消去的数据是可以丢掉的,再配合上先进后出的特点,使得这道题成为了栈的一个经典应用,接下来我们用栈的方法来解决这道题。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack=new Stack<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c=='(' || c=='{' || c=='[') stack.push(c);
else if(stack.isEmpty()||c==')'&&stack.pop()!='('||c=='}'&&stack.pop()!='{'||c==']'&&stack.pop()!='[')
return false;
}
return stack.isEmpty();
}
}