你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。

    如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。

    (回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)

    返回 words 中与给定模式匹配的单词列表。

    你可以按任何顺序返回答案。

    示例:

    输入:words = [“abc”,”deq”,”mee”,”aqq”,”dkd”,”ccc”], pattern = “abb”
    输出:[“mee”,”aqq”]
    解释:
    “mee” 与模式匹配,因为存在排列 {a -> m, b -> e, …}。
    “ccc” 与模式不匹配,因为 {a -> c, b -> c, …} 不是排列。
    因为 a 和 b 映射到同一个字母。

    提示:

    1 <= words.length <= 50
    1 <= pattern.length = words[i].length <= 20


    1. class Solution {
    2. public List<String> findAndReplacePattern(String[] words, String pattern) {
    3. //map 存 模板的相同字母的下标
    4. Map<Character, List<Integer>> map = new HashMap<>();
    5. int m = pattern.length();
    6. for (int i = 0; i < m; ++i) {
    7. List<Integer> list = map.get(pattern.charAt(i));
    8. if (list == null) list = new ArrayList<>();
    9. list.add(i);
    10. map.put(pattern.charAt(i), list);
    11. }
    12. List<String> res = new ArrayList<>();
    13. //illegal 是因为lambda表达式只能用final变量,所以不能判断当前s是否合法,所以不合法就加到illegal
    14. Set<String> illegal = new HashSet<>();
    15. for (String s : words) {
    16. int n = s.length();
    17. Set<Character> set = new HashSet<>();
    18. final boolean flag = true;
    19. map.forEach((key, list) -> {
    20. int size = list.size();
    21. //只有一个下标,只需要判断是不是set是否存在该值
    22. char c = s.charAt(list.get(0));
    23. if (size == 1) {
    24. if (set.contains(c)) {
    25. illegal.add(s);
    26. return;
    27. }
    28. set.add(c);
    29. } else {
    30. if (set.contains(c)) {
    31. illegal.add(s);
    32. return;
    33. }
    34. set.add(c);
    35. for (int i = 1; i < size; ++i) {
    36. if (s.charAt(list.get(i)) != c) {
    37. illegal.add(s);
    38. return;
    39. }
    40. }
    41. }
    42. });
    43. }
    44. //排除illegal的就是答案
    45. for (String s : words)
    46. if (!illegal.contains(s)) res.add(s);
    47. return res;
    48. }
    49. }
    1. class Solution {
    2. public List<String> findAndReplacePattern(String[] ws, String pe) {
    3. List<String> ans = new ArrayList<>();
    4. int[] map = new int[26], vis = new int[26];
    5. for (String s : ws) {
    6. Arrays.fill(map, -1);
    7. Arrays.fill(vis, 0);
    8. boolean ok = true;
    9. for (int i = 0; i < pe.length() && ok; i++) {
    10. int c1 = s.charAt(i) - 'a', c2 = pe.charAt(i) - 'a';
    11. if (map[c1] == -1 && vis[c2] == 0) {
    12. map[c1] = c2; vis[c2] = 1;
    13. } else if (map[c1] != c2) ok = false;
    14. }
    15. if (ok) ans.add(s);
    16. }
    17. return ans;
    18. }
    19. }