- alias:
- parent :: [[algo-哈希]]
- siblings ::
- child ::
- refs: https://leetcode.cn/problems/valid-anagram/
Trick:ASCII 编码表示的字符可直接映射到 int 型数组中,用 ASCII 码映射为数组下标。
class Solution {
// 判断字符曾经出现过的次数是否一致
public boolean isAnagram(String s, String t) {
// Map key 字符 val 出现次数
if (s.length() != t.length()) return false;
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
map.compute(s.charAt(i), (key, oldVal) -> {
if (oldVal == null) return 1;
else return oldVal + 1;
});
}
for (int i = 0; i < t.length(); i++) {
Integer count = map.get(t.charAt(i));
if (count == null || count == 0) return false;
else {
map.put(t.charAt(i), count - 1);
}
}
return true;
}
// 排序、判等
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) return false;
char[] schar = s.toCharArray();
char[] tchar = t.toCharArray();
Arrays.sort(schar);
Arrays.sort(tchar);
return Arrays.equals(schar, tchar);
}
// 若 s 和 t 只包含小写字母
// 小写字母即a-z,对应ascii范围为:97-122
// 可开辟一个长度为26的连续数组,a字符映射为下标0,b字符映射为下标1,以此类推
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) return false;
int[] arr = new int[26];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
arr[ch - 'a']++;
}
for (int i = 0; i < t.length(); i++) {
char ch = t.charAt(i);
if (arr[ch - 'a'] == 0) return false;
else arr[ch - 'a']--;
}
return true;
}
}