/**
 * Given two strings s and t, return true if t is an anagram of s, and false otherwise.
 *
 * An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase,
 * typically using all the original letters exactly once.
 *
 *
 *
 * Example 1:
 *
 * Input: s = "anagram", t = "nagaram"
 * Output: true
 * Example 2:
 *
 * Input: s = "rat", t = "car"
 * Output: false
 *
 *
 * Constraints:
 *
 * 1 <= s.length, t.length <= 5 * 10^4
 * s and t consist of lowercase English letters.
 *
 *
 * Follow up: What if the inputs contain Unicode characters? How would you adapt your solution to such a case?
 * @see <a href="https://leetcode.com/problems/valid-anagram/">LeetCode</a>
 */
fun isAnagram(s: String, t: String): Boolean {
    if (s.length != t.length) {
        return false
    }
    val map = HashMap<Char, Int>()

    for (character in s) {
        map.put(character, map.getOrDefault(character, 0) + 1)
    }

    for (character in t) {
        if (!map.contains(character) || map.get(character) == 0) {
            return false
        } else {
            map.put(character, map.getOrDefault(character, 1) - 1)
        }
    }
    return true
}

/**
 * Given two strings s and t, return true if t is an anagram of s, and false otherwise.
 *
 * An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase,
 * typically using all the original letters exactly once.
 *
 *
 *
 * Example 1:
 *
 * Input: s = "anagram", t = "nagaram"
 * Output: true
 * Example 2:
 *
 * Input: s = "rat", t = "car"
 * Output: false
 *
 *
 * Constraints:
 *
 * 1 <= s.length, t.length <= 5 * 10^4
 * s and t consist of lowercase English letters.
 *
 *
 * Follow up: What if the inputs contain Unicode characters? How would you adapt your solution to such a case?
 * @see <a href="https://leetcode.com/problems/valid-anagram/">LeetCode</a>
 */
fun isAnagram(s: String, t: String): Boolean {
    if (s.length != t.length) {
        return false
    }
    val map = HashMap<Char, Int>()

    for (character in s) {
        map.put(character, map.getOrDefault(character, 0) + 1)
    }

    for (character in t) {
        if (!map.contains(character) || map.get(character) == 0) {
            return false
        } else {
            map.put(character, map.getOrDefault(character, 1) - 1)
        }
    }
    return true
}
