给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
例如下面的输入:
{[]}—->返回true
()]—–>返回false
{[(]}—->返回false
根据题目中所描述的,就拿第一个”{[]}”来说,字符串是否有效取决于刚才入栈的字符是否跟下一个入栈字符构成一对符号,我们只需要先将是{,[,(其中任意一种入栈,如果下一次入栈是”] } )”中的一种,判断栈顶元素的字符是否跟即将入栈的这个字符构成配对关系,这就是核心思想。关于如何匹配字符,我们可以采用map来存储键值对
,思路可以见下图
class Solution {
public boolean isValid( String s) {
HashMap<Character,Character> map = new HashMap<>();
//将对应的符号放入map中,前面作为键,后面作为值
//注意这里键值对顺序为什么要这样
map.put(')','(');
map.put('}','{');
map.put(']','[');
Deque<Character> stack = new ArrayDeque<>();
// Stack<Character> stack = new Stack<>();
if(s.length()==0 || s==null){return true;}
for(int i=0;i<s.length();i++){
if(s.charAt(i) == '[' || s.charAt(i) == '{' || s.charAt(i) == '('){
stack.push(s.charAt(i));
}else if(map.get(s.charAt(i)) == stack.peek()){
//如果下次循环的值作为键,得到的值跟栈顶元素相同,就让栈顶元素出栈
System.out.println("栈顶元素为:"+stack.peek());
stack.pop();
}else{
return false;
}
}
return stack.isEmpty();
}
}
……………… 这道题目的注意点: ……………………
数据结构最好是使用Deque这种类型,类似于栈,但是这个对与stack扩充了一些东西,直接使用原生数据结构stack,直接输入]就会导致栈空,抛出异常,程序就没办法执行下去了,但是程序本身是没有什么问题的,你调用stack.peek()查看栈顶元素就抛出了EmptyStackException,但是Deque封装了一些方法,检查空栈的栈顶元素的时候不会抛异常,会给你返回null。第二个注意点就是map存的键值:我们是通过} ] )当做键,[ { (作为值与栈顶元素进行比较。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1371769065@qq.com