【LeetCode】242. 有效的字母异位词 - hashmap

这里写自定义目录标题

  • 2023-9-4 09:24:54

242. 有效的字母异位词

2023-9-4 09:24:54

中规中矩的做法:先把第一个字符串的字符和对应出现的次数放进hashmap里面。第二个字符串则出现一个字符就减去一次,如果减去的时候 出现了负数,则返回false。如果第二个字符串遍历完了,都没有返回false的情况,那么则证明二者是字母异位词。

class Solution {

    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()){
            return false;
        }
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if (map.containsKey(c)){
                Integer integer = map.get(c);
                map.put(c, ++integer);
            }else {
                map.put(c, 1);
            }
        }

        for (int i = 0; i < t.length(); i++) {
            char c = t.charAt(i);
            if (map.containsKey(c)){
                Integer integer = map.get(c);
                if (integer-- < 1){
                    return false;
                }
                map.put(c, integer);
            }else {
                return false;
            }
        }

        return true;
    }
}    

中规中矩的做法会发现复杂度挺多的。优化:

由于题目中 s 和 t 仅包含小写字母,并且我们可以一遍遍历完 第一个字符串(每出现一次,字母出现的次数+1)和第二个字符串(每出现一次,字母出现的次数 -1),并把遍历的结果放入数组添加链接描述中。

再遍历数组,如果发现有一个元素对应的值是不等于0的,则证明二者不是字母异位词;反之,则是字母异位词。

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

你可能感兴趣的:(#,LeetCode,leetcode,算法,职场和发展)