#include #include #include #include #include "HashTable.h" // NOTE: To enable/disable a solution, change the #if 0 to #if 1 // (or vice versa). Only one solution should be enabled at // a time. #if 1 // Our first solution static HashTable stringToCounter(char *s); bool anagram(char *s, char *t) { if (strlen(s) != strlen(t)) { return false; } HashTable sCounter = stringToCounter(s); HashTable tCounter = stringToCounter(t); //if (HashTableSize(sCounter) != HashTableSize(tCounter)) { // HashTableFree(sCounter); // HashTableFree(tCounter); // return false; //} for (int i = 0; s[i] != '\0'; i++) { int sCount = HashTableGetOrDefault(sCounter, s[i], 0); int tCount = HashTableGetOrDefault(tCounter, s[i], 0); if (sCount != tCount) { HashTableFree(sCounter); HashTableFree(tCounter); return false; } } HashTableFree(sCounter); HashTableFree(tCounter); return true; } static HashTable stringToCounter(char *s) { HashTable sCounter = HashTableNew(); for (int i = 0; s[i] != '\0'; i++) { int count = HashTableGetOrDefault(sCounter, s[i], 0); HashTableInsert(sCounter, s[i], count + 1); } return sCounter; } #endif #if 0 // Our second solution bool anagram(char *s, char *t) { HashTable ht = HashTableNew(); for (int i = 0; s[i] != '\0'; i++) { int count = HashTableGetOrDefault(ht, s[i], 0); HashTableInsert(ht, s[i], count + 1); } for (int i = 0; t[i] != '\0'; i++) { int count = HashTableGetOrDefault(ht, t[i], 0); if (count == 0) { return false; } if (count - 1 == 0) { HashTableDelete(ht, t[i]); } else { HashTableInsert(ht, t[i], count - 1); } } return HashTableSize(ht) == 0; } #endif