solution.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /**
  2. * Return an array of size *returnSize.
  3. * Note: The returned array must be malloced, assume caller calls free().
  4. */
  5. struct Pair {
  6. char car;
  7. char cdr;
  8. };
  9. struct Pair* makeList(int listSize) {
  10. int i;
  11. struct Pair* result = (struct Pair*)malloc(sizeof (struct Pair*) * listSize);
  12. for (i = 0; i < listSize; i++) {
  13. struct Pair next = { 0, 0 };
  14. result[i] = next;
  15. }
  16. return result;
  17. }
  18. char get(struct Pair* map, int listSize, char key) {
  19. int i;
  20. for (i = 0; i < listSize; i++) {
  21. if (map[i].car == key) {
  22. return map[i].cdr;
  23. }
  24. }
  25. return 0;
  26. }
  27. void put(struct Pair* map, int listSize, char key, char value) {
  28. int i;
  29. for (i = 0; i < listSize; i++) {
  30. if (map[i].car == 0) {
  31. map[i].car = key;
  32. map[i].cdr = value;
  33. return;
  34. }
  35. }
  36. }
  37. int hasKey(struct Pair* map, int listSize, char key) {
  38. int i;
  39. for (i = 0; i < listSize; i++) {
  40. if (map[i].car == key) return 1;
  41. }
  42. return 0;
  43. }
  44. int hasValue(struct Pair* map, int listSize, char value) {
  45. int i;
  46. for (i = 0; i < listSize; i++) {
  47. if (map[i].cdr == value) return 1;
  48. }
  49. return 0;
  50. }
  51. void printList(struct Pair* map, int listSize) {
  52. int i;
  53. printf("(");
  54. for (i = 0; i < listSize; i++) {
  55. printf("(%d . %d) ", map[i].car, map[i].cdr);
  56. }
  57. printf(")\n");
  58. }
  59. char** findAndReplacePattern(char** words, int wordsSize, char* pattern, int* returnSize) {
  60. char** result = (char**)malloc(sizeof (char**) * (wordsSize));
  61. int i, j;
  62. for (i = 0, j = 0; i < wordsSize; i++) {
  63. if (checkWord(words[i], pattern)) {
  64. result[j] = words[i];
  65. j++;
  66. }
  67. }
  68. *returnSize = j;
  69. return result;
  70. }
  71. int checkWord(char* word, char* pattern) {
  72. struct Pair* map;
  73. int i;
  74. int result = 1;
  75. int wordSize = 0;
  76. while (word[wordSize] != NULL) {
  77. wordSize++;
  78. }
  79. map = makeList(wordSize);
  80. for (i = 0; i < wordSize; i++) {
  81. if (hasKey(map, wordSize, word[i])) {
  82. if (get(map, wordSize, word[i]) != pattern[i]) {
  83. result = 0;
  84. break;
  85. }
  86. }
  87. else if (hasValue(map, wordSize, pattern[i])) {
  88. result = 0;
  89. break;
  90. }
  91. else {
  92. put(map, wordSize, word[i], pattern[i]);
  93. }
  94. }
  95. free(map);
  96. return result;
  97. }