在字符串中,如果能使用哈希集合,那么大概率也能使用哈希数组
LeetCode链接:242. 有效的字母异位词
1.题目描述
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
1 2
| 输入: s = "anagram", t = "nagaram" 输出: true
|
示例 2:
1 2
| 输入: s = "rat", t = "car" 输出: false
|
提示:
- $1 <= s.length, t.length <= 5 * 10^4$
s
和 t
仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
2.题解
2.1 哈希集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public boolean isAnagram(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); map.put(c, map.getOrDefault(c, 0) + 1); }
for (int i = 0; i < t.length(); i++) { char c = t.charAt(i); map.put(c, map.getOrDefault(c, 0) - 1); }
Set<Map.Entry<Character, Integer>> entries = map.entrySet(); for (Map.Entry<Character, Integer> entry : entries) { if (entry.getValue() != 0) return false; }
return true; } }
|
2.2 哈希数组
- 由于这道题目具有特殊性,只有小写字母,所有转化成哈希数组来做
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public boolean isAnagram(String s, String t) { int[] chs = new int[26];
for(int i = 0; i < s.length(); i++) { chs[s.charAt(i) - 'a']++; }
for(int i = 0; i < t.length(); i++) { chs[t.charAt(i) - 'a']--; }
for(int i = 0; i < chs.length; i++) { if(chs[i] != 0) return false; }
return true; } }
|
2.3 暴力解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public boolean isAnagram(String s, String t) { if (s.length() != t.length()) { return false; }
char[] strs = s.toCharArray(); char[] strt = t.toCharArray();
Arrays.sort(strs); Arrays.sort(strt);
return Arrays.equals(strs, strt); } }
|