// Valid Anagrams - https://leetcode.com/problems/valid-anagram/sou
class Solution {
// Sort the underlying character arrays & compare
// For anagrams they should be an exact match
// Time Complexity: O(nlogn)
// Space Complexity: O(n)
// public boolean isAnagram(String s, String t) {
// if(s == null && t == null) {
// return true;
// }
// if(s == null || t == null) {
// return false;
// }
// if(s.length() != t.length()) {
// return false;
// }
// char[] sChars = s.toCharArray();
// char[] tChars = t.toCharArray();
// Arrays.sort(sChars);
// Arrays.sort(tChars);
// for(int i = 0; i < s.length(); i++) {
// if(sChars[i] != tChars[i]) {
// return false;
// }
// }
// return true;
// }
// Using HashMap to count characters in one of the strings
// and using the other string to decrement counts in Hashmap
// Time Complexity: O(n)
// Space Complexity: O(k)
// where k is number of unique characters in the string
// LeetCode indicate above solution to be much better despite the complexity
// public boolean isAnagram(String s, String t) {
// if(s == null && t == null) {
// return true;
// }
// if(s == null || t == null) {
// return false;
// }
// if(s.length() != t.length()) {
// return false;
// }
// Map count = new HashMap<>();
// for (int i = 0; i < s.length(); i++) {
// count.put(s.charAt(i), count.getOrDefault(s.charAt(i), 0) + 1);
// }
// for (int i = 0; i < t.length(); i++) {
// char c = t.charAt(i);
// if(!count.containsKey(c)) {
// return false;
// }
// int counter = count.get(c) - 1;
// if (counter < 0) {
// return false;
// }
// count.put(c, counter);
// }
// for(Integer countValue: count.values()) {
// if (countValue != 0) {
// return false;
// }
// }
// return true;
// }
// Using Array to count characters
// Time Complexity: O(n)
// Space Complexity: O(1)
// LeetCode indicate sorting solution to be much better despite the complexity
public boolean isAnagram(String s, String t) {
if(s == null && t == null) {
return true;
}
if(s == null || t == null) {
return false;
}
if(s.length() != t.length()) {
return false;
}
int[] freq = new int[26];
for (int i = 0; i < s.length(); i++) {
freq[s.charAt(i) - 'a']++;
freq[t.charAt(i) - 'a']--;
}
for(int i = 0; i < freq.length; i++) {
if(freq[i] != 0) {
return false;
}
}
return true;
}
}