java数据结构与算法刷题-----LeetCode242. 有效的字母异位词

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 这道题,只是考虑了小写字母的情况,所以可以用数组充当hash表的方案。
  2. 对应进阶要求,字符串包含unicode字符,那么就只能用hash表了
  3. 先遍历s字符串,将出现的字符作为key,出现一次value值+1,从0开始
  4. 再遍历t字符串,将出现的字符作为key,出现一次对应value值-1,如果这个字符没有出现过,那么先将其添加到hash表,然后value值置为-1
  5. 最后统一判断,如果value值!=0,那么必然不符合要求
代码:时间复杂度O(n) 空间复杂度O(S),n是字符串长度,s是字符串包含字符的范围,这道题是26个小写字母,s = 26

在这里插入图片描述

class Solution {
    //只针对26个英文字母,也就是做题用的,但是工作场景中,意义不大
    public boolean isAnagram(String s, String t) {
        int[] hash = new int[26];//用数组来充当哈希表,key为下标,value为数组元素值
        for (char c : s.toCharArray()) {//先遍历字符串s,
            hash[c - 'a']++;//出现的字母,按照a = 0,z = 25的key(下标),给对应下标的value值+1
        }
        for (char c : t.toCharArray()) {//然后遍历字符串t
            hash[c - 'a']--;//出现的字母,对应下标的数组元素-1
        }
        for (int num : hash) {//如果最终数组中有不为0的元素,那么说明两个字符串的字母出现频次不一致
            if (num != 0) return false;//返回false
        }
        return true;//如果没有不为0的数组元素,那么说明两个字符串字母频次相同
    }
    //进阶:::实际工作场景中可以使用的思路,但是肯定不能只是简单的这么写,要考虑健壮性,并发性。
    public boolean isAnagram1(String s, String t) {
        if(s.length() != t.length()) return false;//两个字符串,长度不一致,肯定不符合
        Map<Character,Integer> table = new HashMap<Character,Integer>();//哈希表
        for(int i = 0;i < s.length();i++){//先遍历s
            char ch = s.charAt(i);
            //getOrDefault(key,default) : 此API表示获取指定key的value值,如果没有,就创建key,并将value设置为默认值default.
            table.put(ch,table.getOrDefault(ch,0)+1);//如果可以存在,就出现次数+1,否则置为1.
        }
        for(int i = 0; i < t.length();i++){//再遍历t
            char ch = t.charAt(i);
            table.put(ch,table.getOrDefault(ch,0)-1);//如果不存在这个key,置为-1
            if(table.get(ch) < 0) return false;//如果当前key的value小于0,那么必然不符合
        }
        return true;//都符合就返回true;
    }
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

殷丿grd_志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值