题目20:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合
/*可以学到的知识点:*/
char ch=s.charAt(i); //获取一个字符串中的单个字母
map.containsKey(ch); //判断map集合中是否有键值为ch的键
三种解法:
第一种:
最笨的一种方法:依次获取到每一个字母,如果是左括号就直接压入栈,如果是右括号且栈不为空就分别判断栈顶的的元素是不是对应的左括号。最终如果栈是空的,则配对成功,否则失败。
Stack<Character> stack=new Stack();
for(int i=0;i<s.length();i++){
char character=s.charAt(i);
if(character=='('||character=='{'||character=='['){
stack.push(character);
}
if(character==')'){
if(!stack.isEmpty()){
char popChar=stack.pop();
if(popChar!='('){
return false;
}
}else{
return false;
}
}
if(character=='}'){
if(!stack.isEmpty()){
char popChar=stack.pop();
if(popChar!='{'){
return false;
}
}else{
return false;
}
}
if(character==']'){
if(!stack.isEmpty()){
char popChar=stack.pop();
if(popChar!='['){
return false;
}
}else{
return false;
}
}
}
if(stack.isEmpty()){
return true;
}
return false;
}
第二种:比较巧妙的一种,但是时空复杂度都很高
while(s.contains("()")||s.contains("{}")||s.contains("[]")){
if(s.contains("()")){
s=s.replace("()","");
}
if(s.contains("{}")){
s=s.replace("{}","");
}
if(s.contains("[]")){
s=s.replace("[]","");
}
}
return s.length()==0;
第三种:官方答案的解法:利用map集合去存储一对儿一对儿的括号
int n=s.length();
if(n%2==1){
return false;
}
Map<Character,Character> map=new HashMap<>();
map.put(')','(');
map.put('}','{');
map.put(']','[');
Stack<Character> stack=new Stack();
for(int i=0;i<n;i++){
char ch=s.charAt(i);
if(map.containsKey(ch)){
if(stack.isEmpty()||stack.peek()!=map.get(ch)){
return false;
}
stack.pop();
}else{
stack.push(ch);
}
}
return stack.isEmpty();