给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()” 输出:true 示例 2:
输入:s = “()[]{}” 输出:true 示例 3:
输入:s = “(]” 输出:false
思路:
匹配过程中,我用的是哈希表
- 哈希表芝士
1.put(K key, V value) 将键(key)/值(value)映射存放到Map集合中
public class Test {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put(“Tom”, 100);//向HashMap中添加元素
}
}2.get(Object key) 返回指定键所映射的值,没有该key对应的值则返回 null,即获取key对应的value。 public
class Test {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put(“Tom”, 100);
map.put(“Tom”, 0);
int score = map.get(“Tom”);// 获取key对应的value
System.out.println(score);// key不允许重复,若重复,则覆盖已有key的value
} }
3.size() 返回Map集合中数据数量,准确说是返回key-value的组数。 public class Test {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put(“Tom”, 100);
map.put(“Jim”, 90);
map.put(“Sam”, 91);
System.out.println(map.size());
}
4.containsKey(Object key) Hashmap判断是否含有key public class Test {
public static void main(String[] args) {
HashMap<String, Integer> map=new HashMap<>();
/boolean///判断map中是否存在这个key
System.out.println(map.containsKey(“DEMO”));//false
map.put(“DEMO”, 1);
System.out.println(map.containsKey(“DEMO”));//true
} }
写代码过程中的疑点:
1.哈希表最后的类型是Character,而栈是char类型,那么为什么匹配之后==是true 呢?
java会把character类型自动拆箱为char类型,在比较过程中,实际比较的是char类型的值
2.我一开始使用的是stack!=null来判断栈是否为空为什么错误呢?
因为栈是引用类型的,一开始是new,没有指向任何地方,一直是null,所以不对,你给栈赋值的过程也没有改变栈的指向,引用类型不能用==null判断,可以用size函数或者isEmpty
class Solution {
public boolean isValid(String s) {
//左括号入栈,遇到匹配的右则出栈
//创建哈希表
HashMap<Character, Character> h = new HashMap<Character, Character>();
h.put('(', ')');
h.put('{', '}');
h.put('[', ']');
//创建栈
if(h.containsKey(s.charAt(0))==false){
return false;
}
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
//如果是左括号 入栈
if (h.containsKey(s.charAt(i))) {
stack.push(s.charAt(i));
}
//当右括号满足peek的匹配条件,出栈
else if (stack.isEmpty()!=true&&s.charAt(i) == h.get(stack.peek())) {
stack.pop();
}
else{
return false;
}
}
if(stack.size()!=0)
return false;
else
return true;
}
}