一、题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
例一
输入:s = "()"
输出:true
例二
输入:s = "()[]{}"
输出:true
例三
输入:s = "(]"
输出:false
例四
输入:s = "([)]"
输出:false
例五
输入:s = "{[]}"
输出:true
二、题目思路(优先使用栈方式解决)
1、暴力解决思路
首先看到这个问题的时候,我们可以清晰的发现,字符串中的‘{}’,‘[]’,'()'都是成对出现的,我们如果整体看,其实会发现我们只需要定义一个循环变量,循环的次数是s这个字符串总长度的一半即可。每次循环的时候我们替换掉‘{}’,‘[]’,'()' 这三个串,然后替换为""即可,最后判断字符串是否为空。
2、使用栈方式解决
首先我们需要申请一个栈空间,然后呢,每次循环这个字符串的一个字符,如果是'('我们就向栈里放入一个它对应的')','['对应的']','{'对应的'}',并且结束此次循环。我们可以利用栈的原理先进后出去匹配,如果出现当前s这个字符串此位置上的c不属于'(','[','{',那么就会走入到最后的判断判断当前位置上的字符是否和栈的第一个字符一致,一致的话说明可以匹配上,不一致则返回false。
三、代码展示
1、暴力解法
private static boolean isValids(String s) {
int length = s.length() / 2;
for (int i = 0; i < length; i++) {
s = s.replace("()", "").replace("{}", "").replace("[]", "");
}
return s.length() == 0;
}
2、栈方式解法
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();
知识扩展:(关于栈的一些方法)
Modifier and Type | Method and Description |
boolean | empty() 测试此堆栈是否为空。 |
E | peek() 查看此堆栈顶部的对象,而不从堆栈中删除它。 |
E | pop() 删除此堆栈顶部的对象,并将该对象作为此函数的值返回。 |
E | push(E item) 将项目推送到此堆栈的顶部。 |
int | search(Object o) 返回一个对象在此堆栈上的基于1的位置。 |