LeetCode 竞赛题 890. 查找和替换模式

你有一个单词列表 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

本题根据题目中的提示即可:每个字母映射到另一个字母,没有两个字母映射到同一个字母。

扫描二维码关注公众号,回复: 2886079 查看本文章

利用Map构造映射。

代码如下:

class Solution {
    public List<String> findAndReplacePattern(String[] words, String pattern) {
        List<String> ans = new ArrayList<>();
        for (int i=0; i < words.length; i++){
            //比较words中每一个元素
            Map<String,String> comp = new HashMap<>();
            for (int j=0; j < pattern.length(); j++){
                String a = pattern.substring(j,j+1);
                String b = words[i].substring(j,j+1);
                if (comp.containsKey(a)){
                    //判断映射是否相等
                    String jug = comp.get(a);
                    if (jug.equals(b) == false) break;
                }
                else if (comp.containsValue(b)) break;//两个字母映射到了同一个字母
                else comp.put(a,b);


            }
            if (j==pattern.length()) ans.add(words[i]);
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39407523/article/details/81836573