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

本文介绍了如何使用Java中的HashMap和数组来解决LeetCode上的字母异位词问题,讨论了在实现过程中处理无序键值的问题以及相关数据结构和字符串操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

题目简介

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

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

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

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

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

public boolean isAnagram(String s, String t) {
        HashMap<String, Integer> map = new HashMap<>();
        HashMap<String, Integer> 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<String, Integer> map = new HashMap<>();        //尖括号里是Object类型

        ArrayList<String> sites = new ArrayList<String>();              //该数组不能用 [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<String, Integer> map = new HashMap<>(); 

        HashMap<String, Integer> 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<Integer, Integer> map = new HashMap<Integer, Integer>();
 
        for (Map.Entry<Integer, Integer> 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类型可以迭代。

以下是彩色图像的PSNRSSIMLPIPS和CIEDE2000评价算法的Matlab源码示例: 1. PSNR(峰值信噪比): ```matlab function psnr_value = PSNR(original, distorted) [M, N, ~] = size(original); mse = sum((original(:) - distorted(:)).^2) / (M * N * 3); max_value = max(original(:)); psnr_value = 10 * log10(max_value^2 / mse); end ``` 2. SSIM(结构相似性指数): ```matlab function ssim_value = SSIM(original, distorted) K1 = 0.01; K2 = 0.03; L = 255; C1 = (K1 * L)^2; C2 = (K2 * L)^2; original = double(original); distorted = double(distorted); mean_original = filter2(fspecial('gaussian', 11, 1.5), original, 'valid'); mean_distorted = filter2(fspecial('gaussian', 11, 1.5), distorted, 'valid'); var_original = filter2(fspecial('gaussian', 11, 1.5), original.^2, 'valid') - mean_original.^2; var_distorted = filter2(fspecial('gaussian', 11, 1.5), distorted.^2, 'valid') - mean_distorted.^2; cov_original_distorted = filter2(fspecial('gaussian', 11, 1.5), original .* distorted, 'valid') - mean_original .* mean_distorted; ssim_map = ((2 * mean_original .* mean_distorted + C1) .* (2 * cov_original_distorted + C2)) ./ ((mean_original.^2 + mean_distorted.^2 + C1) .* (var_original + var_distorted + C2)); ssim_value = mean2(ssim_map); end ``` 3. LPIPS(感知相似性指标):需要下载并使用LPIPS库,源码和使用说明可在https://github.com/richzhang/PerceptualSimilarity 找到。 4. CIEDE2000(CIE 2000色差公式):需要下载并使用CIEDE2000库,源码和使用说明可在https://www.mathworks.com/matlabcentral/fileexchange/46861-color-difference-cie-de2000 找到。 以上是基本的示例代码,用于评估图像质量的不同评价指标。你可以根据实际需求和图像数据进行适当的调整和修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值