/
- 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
- 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
-
- 示例 1:
- 输入: “()”
- 输出: true
-
- 示例 2:
- 输入: “()[]{}”
- 输出: true
-
- 示例 3:
- 输入: “(]”
- 输出: false
-
- 示例 4:
- 输入: “([)]”
- 输出: false
-
- 示例 5:
- 输入: “{[]}”
- 输出: true
/*
本题用java中的栈来解决比较简便。。。
1.栈定义:栈是一种只能在一端进行插入或删除操作的线性表,先进的先出,后进入的后出来!!!!
2.栈的构造方法
Stack();
Stack stack=new Stack();
//栈还可以添加泛型
Stack<String> stack=new Stack<>();
3.栈中方法
Stack stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
//empty()方法测试栈中是否为空 为空返回true 否则返回false
System.out.println(stack.empty());
//peek()查看此堆栈顶部的对象,而不从堆栈中删除它。
System.out.println(stack.peek());
//pop()删除此堆栈顶部的对象,并将该对象作为此函数的值返回。
int a= (int) stack.pop();
System.out.println(a);
//push(E item)将项目推送到此堆栈的顶部。
stack.push(1);
//search(Object o)返回一个对象在此堆栈上的基于1的位置,返回值类型int
4.题解:
大概思路:用HashMap来存储三组括号的值。左括号为Key(键),右括号为Value(值),将字符串s转换成char数组,遍历char数组,利用HashMap中的containsKey() 方法来检测左括号即键,如果是则写入堆栈中,如果不是键值,即为右括号,做弹出操作,弹出堆栈中与之匹配的左括号,一直检测下去,如果最后堆栈中不为空,则说明只有左括号,没有与之匹配的右括豪。
public static boolean isValid(String s) {
if (s == null || s.equals("")) {
return true;
}
Map<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
for (char a : chars) {
if (map.containsKey(a)) {
stack.push(a);
} else {
if (stack.isEmpty()) return false;
char number = stack.pop();
if (map.get(number) != a) return false; //弹出后还必须与此键对应的值比较,看是否匹配,例如(] 如果不检测则不成立
}
}
return stack.isEmpty();
}