刚开始看这个题没有认真思考,老想着用简单的if-else判断解决问题
三次调试后仍然有样例不过关,最后采用数据结构中的栈和集合来解决问题
思路:
1.先创建集合并给集合中添加数据
Map<Character,Character> map = new HashMap<Character,Character>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
2.用Deque容器来创建栈
deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列。
Deque<Character> stack = new LinkedList<Character>();
3.最后判断当前元素是否与栈顶元素匹配,匹配则当前栈顶元素出栈,不匹配则当前元素入栈。
全部代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/**
* 给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。
* 有效字符串需满足:
*
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
*
* 示例 1:
* 输入:s = "()"
* 输出:true
* 示例2:
* 输入:s = "()[]{}"
* 输出:true
*
* 示例3:
* 输入:s = "(]"
* 输出:false
*
* 示例4:
* 输入:s = "([)]"
* 输出:false
*
* 示例5:
* 输入:s = "{[]}"
* 输出:true
*
* 提示:
* 1 <= s.length <= 104
* s 仅由括号 '()[]{}' 组成
*
*/
public class test07 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine();
//System.out.println(s.length());
System.out.println(s+"是否有效:"+isValid(s));
}
// public static boolean isValid(String s){
// boolean flag = false;
// for( int i=(s.length()/2)-1; i >= 0; i--){
// int j = 1;
// if ( s.charAt(i) == '(' && s.charAt(i+j) == ')'){
// flag = true;
// j += 2;
// }else if (s.charAt(i) == '[' && s.charAt(i+j) == ']'){
// flag = true;
// j += 2;
// }else if (s.charAt(i) == '{' && s.charAt(i+j) == '}'){
// flag = true;
// j += 2;
// }else{
// flag = false;
// break;
// }
// }
// return flag;
// }
public static boolean isValid(String s){
int n = s.length();
if( n%2 ==1){
return false;
}
Map<Character,Character> map = new HashMap<Character,Character>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
//用栈先进后出的特点进行判断,当前符号只需要和栈顶元素进行匹配:匹配,栈顶元素出栈;反之,当前元素入栈
Deque<Character> stack = new LinkedList<Character>();
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();
}
}