给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
分析过程:
检验括号是否匹配的方法用“期待的急迫程度”这个概念来描述。
分析可能出现的不匹配的情况:
1、到来的右括弧非是所“期待”的;[ ( ] )
2、到来的是“不速之客” ( ( ) ] )
3、直到结束,也没有到来所“期待”的 ( [ ( ) )
算法设计思想:
1、凡出现左括弧,则进栈;
2、凡出现右括弧,首先检查栈是否空
若栈空,则表明“右括弧”多了
否则和栈顶元素比较,
若相等,则“左括弧出栈”
否则不匹配
3、表达式检验结束时,
若栈空,则匹配正确
否则表明“左括弧”多了
代码中遇到的问题:
peek()方法: 查看栈顶对象而不移除它
java里Stack的peek方法是返回栈顶的元素但不移除它。但Stack的pop方法是会移除的
ToCharArray( ):将字符串对象中的字符转换为一个字符数组。
length和length()的区别
length返回数组的长度,length()返回字符串的长度
String s=“adfjsdfj”;
int a=s.length();
这个可以获取到字符串的长度!
int[] arr={3,5,7,8,9,10};
int b=arr.lenth;
//这个可以获取到数组的长度!
代码:
class Solution { public boolean isValid(String s) { Stack<Character> stack=new Stack<>(); char[] chs=s.toCharArray(); int len=chs.length; if((len%2)==1) return false; for(int i=0;i<len;i++){ if(stack.isEmpty()||!isMatch(stack.peek(),chs[i])) stack.push(chs[i]); else stack.pop(); } return stack.isEmpty(); } public boolean isMatch(char a,char b){ switch(a){ case'(':if(b==')') return true; else return false; case'{':if(b=='}') return true; else return false; case'[':if(b==']') return true; else return false; default:return false; } } }