05_02_leetcode_242_有效的字母异位

1.题目描述

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

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram

2.思路讲解

1)hash存储字母和对应次数。遍历s,把字母和对应出现的总次数存入hash表,遍历t,若字母存在hash表中,对应字母次数减一,若字母不存在hash表中,匹配失败。遍历hash表,若所有字母的个数都为空,则匹配成功,否则匹配失败。

时间复杂度:O(len(s))+O(len(t))+O(len(hash)),因为遍历s和t的时候,需要每次遍历hash表的键值,增加了时间复杂度

空间复杂度:O(len(hash))

2)先对字符串排序,在比较是否相等

时间复杂度:O(nlog(n))+ O(n)

空间复杂度:为s和t创建char数组

3.我的代码

1)hash表

public boolean isAnagram(String s, String t) {
        // 1.创建hash表
        Map<Character, Integer> map = new HashMap<>();
        // 2.遍历s把字母对应个数插入
        for (int i = 0; i < s.length(); i++) {
            // 查看hash表中是否存在当前字母,如果不存在,就插入该字母;就把当前字母加一
            if (map.containsKey(s.charAt(i))) {
                int num = map.get(s.charAt(i));
                map.put(s.charAt(i), ++num);
            } else {
                map.put(s.charAt(i), 1);
            }
        }
        // 3.遍历t如果字母在hash表中,就个数减一,如果不在hash表中,返回false
        for (int i = 0; i < t.length(); i++) {
            if (map.containsKey(t.charAt(i))) {
                int num = map.get(t.charAt(i));
                num--;
                map.put(t.charAt(i), num);
            } else
                return false;

        }
        // 4.检测hash表是否为0值,如果是返回true,不是返回false
        for (Character key : map.keySet()) {
            int num = map.get(key);
            if (num != 0)
                return false;
        }
        return true;

    }

2)先对字符串排序,再比对两个排序后的字符串是否相等

public boolean isAnagram(String s, String t) {

        if (s.length() != t.length())
            return false;
        char[] str1 = s.toCharArray();
        char[] str2 = t.toCharArray();
        Arrays.sort(str1);
        Arrays.sort(str2);
        return Arrays.equals(str1, str2);
    }

 

4.金牌思路

写法很多

posted @ 2021-04-02 22:01  zhustarstar  阅读(53)  评论(0)    收藏  举报