数据结构与算法【LeetCode-Offer】:3.2哈希表—有效的字母异位词

📃 题目描述

题目链接:
在这里插入图片描述

🔔 解题思路

哈希表的方式

Hash 表的 key 存储字符,value 存储该字符出现的次数

  • 先处理字符串 s 将其存入 Hash 表
  • 然后再处理字符串 t,若 t 中的字符存在于 Hash 表中,则该字符对应的 value 减 1
  • 一旦发现 value < 0,则立即返回 false;
  • 若直到 t 全部处理完毕后,Hash 表中仍然存在 value > 0,则返回 false;
package com.kami.leetcode.hash_table;

import java.util.HashMap;

/**
 * @Description: TODO
 * @author: scott
 * @date: 2022年01月13日 11:05
 */
public class Solution_242 {
    public boolean isAnagram(String s, String t){

        HashMap<Character, Integer> map = new HashMap<>();

        if(s.length() != t.length()){
            return false;
        }

        //处理第一个字符串s
        //toCharArray() 方法将字符串转换为字符数组。
        for(char ch : s.toCharArray()){
            //map.getOrDefault(ch, 0)
            //map中存在ch的时候,获得ch对应的value
            //map中不存在ch的时候,使用默认值0
            map.put(ch, map.getOrDefault(ch, 0) + 1);
        }

        // 处理第二个字符串 t
        for(char ch : t.toCharArray()){
            // 如果 map 中不存在该字符
            if(!map.containsKey(ch)){
                return false;
            }else {
                // map 中存在该字符但 value 已经为 0
                if(map.get(ch).equals(0)){
                    return false;
                }
                map.put(ch, map.get(ch) - 1);
            }
        }

        //遍历map
        // 若直到 t 全部处理完毕后,Hash 表中仍然存在 value > 0,则返回 false
        for(Character ch : map.keySet()){
            if(map.get(ch) > 0){
                return false;
            }
        }

        return true;
    }
}

数组的方式

进一步思考下,其实数组就是一个简单的哈希表,对于哈希表中的 key,如果哈希值比较连续且固定,我们可以用数组的下标来等同。事实上,如果数组是适用的,那么最好就不要用哈希表,因为使用哈希表的空间消耗要比数组大,哈希表可能要维护红黑树而且还要做哈希函数,数据量大的话就能体现出来差别了。

这个题目中的 key 存储的就是 26个字母,那我们只需要将其转成 int 作为数组的下标即可:

public boolean isAnagram(String s, String t){
        if(s.length() != t.length()){
            return false;
        }

        int[] num = new int[26];

        // 处理第一个字符串 s——将字符转成int类型,需要对照ascll码
        for(char ch : s.toCharArray()){
            num[ch - 'a'] += 1;
        }

        //处理第二个字符串 t
        for(char ch : s.toCharArray()){
            num[ch - 'a'] -= 1;
        }

        // 若 t 全部处理完毕后,数组中仍然存在 value != 0,则返回 false
        for (int i : num) {
            if(i != 0){
                return false;
            }
        }

        return true;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂野小白兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值