LeetCode刷题-有效的字母异位词

前言说明

算法学习,日常刷题记录。

题目连接

有效的字母异位词

题目内容

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

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

示例1:

输入: s = "anagram", t = "nagaram"

输出: true

示例2:

输入: s = "rat", t = "car"

输出: false

提示:

1 <= s.length, t.length <= 5 * 10^4

s 和 t 仅包含小写字母

进阶:

如果输入字符串包含unicode字符怎么办?你能否调整你的解法来应对这种情况?

分析过程

第一步

若字符串s和字符串t的长度不同,肯定不是互为字母异位词,直接返回false。

第二步

遍历字符串s,用集合map来保存字符串s的各种字符的数量。

第三步

遍历字符串t,若集合map找不到字符,那么字符串s和字符串t不互为字母异位词,直接返回false。

若集合map找到字符,那么集合map的字符数量减1。若此时字符的数量小于0,那么字符串s和字符串t中的此字符数量不相等,所以字符串s和字符串t肯定不互为字母异位词,直接返回false。

第四步

遍历字符串t结束后,遍历集合map,判断每一个key的value值是否都大于0,只要出现一个value值大于0,那么字符串s和字符串t就不互为字母异位词,直接返回false。

第五步

若能遍历完集合map,那么字符串s和字符串t互为字母异位词,返回true。因为这时集合map中的字符数量全部都是0,证明字符串s和字符串t中每个字符出现的次数都相同,刚好符合互为字母异位词。

解答代码

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            // 若字符串s和字符串t的长度不同,肯定不是字母异位词,返回false
            return false;
        }

        // 思路:用集合map保存字符串s的字符的数量,遍历字符串t时集合map中的字符数量减1,若有集合map中不存在的字符,不是字母异位词,遍历完字符串t,若集合map中的字符数量全部变为0,那么就是字母异位词,否则不是字母异位词

        // 定义集合map,保存字符串s各个字符的数量
        Map map = new HashMap<>();

        // 遍历字符串s的字符
        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(i);
            // 保存字符的数量到集合map中,若集合map中不存在此字符的key,数量保存为1
            map.put(c, map.getOrDefault(c, 0) + 1);
        }

        // 遍历字符串t的字符
        for (int i = 0; i < t.length(); ++i) {
            char c = t.charAt(i);
            if (map.containsKey(c)) {
                // 若集合map中存在key,数量减1
                map.put(c, map.get(c) - 1);
                if (map.get(c) < 0) {
                    // 若集合map中的key的数量小于0,那么字符串s和字符串t中的此字符数量不相等,不是字母异位词,返回false
                    return false;
                }
            } else {
                // 若集合map中不存在key,那么不是字母异位词,返回false
                return false;
            }
        }

        // 遍历集合map
        for (Map.Entry entry : map.entrySet()) {
            if (entry.getValue() > 0) {
                // 只要有一个key的数量大于0,那么字符串s和字符串t中就存在数量不相等字符,返回false
                return false;
            }
        }

        // 遍历结束,证明字符串s和字符串t中的所有字符的数量相等,返回true
        return true;
    }
}

提交结果

执行用时16ms,时间击败23.59%的用户,内存消耗39MB,空间击败20.85%的用户。

运行结果

原文链接

原文链接:有效的字母异位词

你可能感兴趣的:(LeetCode刷题-有效的字母异位词)