leetcode 890. 查找和替换模式

版权声明:copy-right:BHY https://blog.csdn.net/WallBreakerBhy/article/details/84618511

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


根据题意就是要在words里找到和pattern模式相同的字符串。

遍历words,取出每个word,将其与pattern比对,如果模式相同则加入结果集中。

要判断一个word和pattern模式是否相同,可以设两个map来实现,建立word[i]和pattern[i]之间的双映射。当word[i]和pattern[i]之间还没有建立映射,则为其建立映射:map1[word[i]]=pattern[i],map2[pattern[i]]=word[i]。若发现word[i]或pattern[i]已有映射却不是指向的对方,即map1[word[i]]!=pattern[i]或map2[pattern[i]]!=word[i],则说明模式不相同。

需要注意的是遍历words时记得把两个map清空,并设立flag来标记word与pattern模式是否相同。遍历一遍后返回结果集即可。

class Solution {
    public List<String> findAndReplacePattern(String[] words, String pattern) {
        List<String> res =  new ArrayList<>();
        Map<Character,Character> m1 = new HashMap<>();
        Map<Character,Character> m2 = new HashMap<>();
        boolean flag=true;
        for(String s:words){
            m1.clear();
            m2.clear();
            flag=true;
            for(int i=0;i<s.length();i++){
                char c1 = s.charAt(i);
                char c2 = pattern.charAt(i);
                if(!m1.containsKey(c1)&&!m2.containsKey(c2)){
                    m1.put(c1,c2);
                    m2.put(c2,c1);
                }
                else if(m1.containsKey(c1)&&m1.get(c1)!=c2||m2.containsKey(c2)&&m2.get(c2)!=c1){
                    flag=false;
                    break;
                }
            }
            if(flag){
                res.add(s);
            }
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/WallBreakerBhy/article/details/84618511