solution.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. * @param {string[]} words
  3. * @param {string} pattern
  4. * @return {string[]}
  5. */
  6. var WordMapper = function() {
  7. this.store = {};
  8. this.valueSet = new Set();
  9. };
  10. WordMapper.prototype.hasKey = function(s) {
  11. return this.store[s] != null;
  12. };
  13. WordMapper.prototype.hasValue = function(v) {
  14. return this.valueSet.has(v);
  15. }
  16. WordMapper.prototype.get = function(s) {
  17. if (this.hasKey(s)) {
  18. return this.store[s];
  19. }
  20. throw new Error('Key not found: ', s);
  21. };
  22. WordMapper.prototype.put = function(s, v) {
  23. if (this.hasKey(s)) {
  24. throw new Error('Cannot overwrite key: ', s);
  25. }
  26. else if (this.hasValue(v)) {
  27. throw new Error('Cannot duplicate value: ', v);
  28. }
  29. this.store[s] = v;
  30. this.valueSet.add(v);
  31. };
  32. var findAndReplacePattern = function(words, pattern) {
  33. return words.filter(w => checkWord(w, pattern));
  34. };
  35. var checkWord = function(word, pattern) {
  36. var wordMapper = new WordMapper();
  37. for (var i = 0; i < word.length; i++) {
  38. var c1 = word[i];
  39. var c2 = pattern[i];
  40. if (wordMapper.hasKey(c1)) {
  41. if (wordMapper.get(c1) !== c2) {
  42. return false;
  43. }
  44. }
  45. else if (wordMapper.hasValue(c2)) {
  46. return false;
  47. }
  48. else {
  49. wordMapper.put(c1, c2);
  50. }
  51. }
  52. return true;
  53. };