解法一

建立两张映射表分别为表示word与pattern间字母的双射关系。
遍历单词的各个字母,如果符合映射表就继续,如果没有建立映射关系就根据当前值建立双射关系,如果不符合已有的双射关系说明该单词和模式串是不匹配的。

  1. import java.util.Arrays;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. class Solution {
  5. public List<String> findAndReplacePattern(String[] words, String pattern) {
  6. List<String> ansList = new LinkedList<>();
  7. // word->pattern
  8. char[] tableX = new char[26];
  9. // pattern->word
  10. char[] tableY = new char[26];
  11. int i;
  12. char ch1, ch2;
  13. for (String word : words) {
  14. boolean flag = true;
  15. for (i = 0; i < word.length(); ++i) {
  16. ch1 = word.charAt(i);
  17. ch2 = pattern.charAt(i);
  18. if ((tableX[ch1 - 97] == ch2) && (tableY[ch2 - 97] == ch1)) {
  19. continue;
  20. }
  21. if ((tableX[ch1 - 97] == '\0') && (tableY[ch2 - 97] == '\0')) {
  22. tableX[ch1 - 97] = ch2;
  23. tableY[ch2 - 97] = ch1;
  24. continue;
  25. }
  26. if ((tableX[ch1 - 97] != ch2) || (tableY[ch2 - 97] != ch1)) {
  27. flag = false;
  28. break;
  29. }
  30. }
  31. if (flag) {
  32. ansList.add(word);
  33. }
  34. Arrays.fill(tableX, '\0');
  35. Arrays.fill(tableY, '\0');
  36. }
  37. return ansList;
  38. }
  39. }