【LeetCode】242. 有效的字母异位词(HashMap方法)

  今日学习的文章链接和视频链接

leetcode题目地址:242. 有效的字母异位词

 代码随想录题解地址:代码随想录

题目简介

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

看到题目的第一想法(可以贴代码)

1. 主要是对HashMap和HashSet之类的java类还不太熟悉

2. 第一反应是用HashMap,,key用来存出现的每个字符,value用来存每个字符出现的次数,然后遍历每一个元素,比较他们的key和value是否一致。

public boolean isAnagram(String s, String t) {
        HashMap map = new HashMap<>();
        HashMap map2 = new HashMap<>();
        for (String i : s.split("")){
            if (map.containsKey(i) == false){
                map.put(i, 1);
            }else{
                int temp = map.get(i);
                temp++;
                map.replace(i,temp);
            }
        }
        for (String i : t.split("")){
            if (map2.containsKey(i) == false){
                map2.put(i, 1);
            }else{
                int temp = map2.get(i);
                temp++;
                map2.replace(i,temp);
            }
        }
        
        boolean check = true;
        if (map.size() != map2.size()) return false;
        
        Set set1 = map.keySet();
        Object[] arr1 = set1.toArray();
        Arrays.sort(arr1);

        Set set2 = map2.keySet();
        Object[] arr2 = set2.toArray();
        Arrays.sort(arr2);

        for (int i = 0; i < map.size(); i++){
            String key1 = (String)arr1[i];
            String key2 = (String)arr2[i];
            int val1 = map.get(key1);
            int val2 = map2.get(key2);
            if (key1.equals(key2) == false || val1 != val2){
                check = false;
                break;
            }
        }
        // 遍历print HashMap元素
        // Iterator iterator = map.keySet().iterator();
        // while (iterator.hasNext()){
        //     String key = (String)iterator.next();
        //     System.out.println(key+"="+map.get(key));
        // }
        // System.out.println(map.size());     //显示HashMap长度

        return check;
    }

实现过程中遇到哪些困难

1. HashMap的key值是无序的,需要将key序列转换为set,再转换为array,再排序,才能有序。

        网上处理key序列无序方法:

                将entrySet转换为List,然后重写比较器比较即可.这里可以使用List.sort(comparator),也

                可以使用Collections.sort(list,comparator)。

看完代码随想录之后的想法

【解题思路】

数组解法:定义一个长度为26的数组,依次代表 a~z,每个元素值代表某字符出现的次数;对于第二个数组,对出现频率做对应减法,最终数组每一个元素值都为0,则为异位词。

【想法】

1. 哈希题常用的3种数据结构:

        数组(适用于哈希值比较小,范围可控)、

        set(适用于hash值很大)、

        map(适用于key-value)。

看完视频自己写的ACC:

public boolean isAnagram(String s, String t) {
        int[] sites = new int[26];
        for (int i = 0; i < s.length(); i++){
            sites[s.charAt(i)-97]++;
        }
        for (int i = 0; i < t.length(); i++){
            sites[t.charAt(i)-97]--;
        }
        for (int i : sites){
            if (i != 0) return false;
        }
        return true;
    }

学习时长

9:05 ~ 10:13  解题成功

9:31 ~ 11:03  看视频题解、写博客


今日收获

1. HashMap的key值是 无序 的,需要将key序列转换为set,再转换为array,再排序,才能有序。

2. 一些类的写法、作用和注意事项:

        HashMap map = new HashMap<>();        //尖括号里是Object类型

        ArrayList sites = new ArrayList();              //该数组不能用 [index] 下标

        int[] sites = new int[26];                        //只有该数组不能用 [index]下标

        

        Iterator iterator = map.keySet().iterator();        //迭代器

        while (iterator.hasNext()){        //判断next是否为空

            String key = (String)iterator.next();        //遍历next元素

        }

        

        Set set1 = map.keySet();        //将HashMap的key值序列转换成Set

        Object[] arr1 = set1.toArray();        //Set转换成列表

        Arrays.sort(arr1);        //数组才能排序

        key1.equals(key2)        //字符串比较

3. HashMap方法:

        Map map = new HashMap<>(); 

        HashMap map = new HashMap<>(); 

        map.containsKey(i);        hashMap.containsValue(1);

        map.put(i, 1);        map.putIfAbsent("aa",4);        

        map.get(i); 

        map.keySet();        map.values()

        map.size();

       map.remove("bb");        map.replace(i,temp);

遍历:

        Map map = new HashMap();
 
        for (Map.Entry entry : map.entrySet()) {
 
            System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
 
        }

4. ArrayList方法【略】:

        sites.add("Google");

5. 'a'的ASCII码为97。

6. String转char:

        1. 使用String.charAt(index)(返回值为char)可以得到String中某一指定位置的char。
        2. 使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。

Char转String:

        1. String s = Character.toString('c');        //方式太多,略

7. 求String长度:str.length()        求数组长度:arr.length

8. int类型可以迭代。

你可能感兴趣的:(java,开发语言)