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

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

java数据结构与算法刷题-----LeetCode242. 有效的字母异位词_第1张图片

解题思路
  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

java数据结构与算法刷题-----LeetCode242. 有效的字母异位词_第2张图片

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;
    }
}

你可能感兴趣的:(算法,java,哈希算法,散列表,算法,leetcode)