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.金牌思路
写法很多