zoukankan      html  css  js  c++  java
  • 890. Find and Replace Pattern

    You have a list of words and a pattern, and you want to know which words in words matches the pattern.

    A word matches the pattern if there exists a permutation of letters p so that after replacing every letter x in the pattern with p(x), we get the desired word.

    (Recall that a permutation of letters is a bijection from letters to letters: every letter maps to another letter, and no two letters map to the same letter.)

    Return a list of the words in words that match the given pattern. 

    You may return the answer in any order.

    Example 1:

    Input: words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"
    Output: ["mee","aqq"]
    Explanation: "mee" matches the pattern because there is a permutation {a -> m, b -> e, ...}. 
    "ccc" does not match the pattern because {a -> c, b -> c, ...} is not a permutation,
    since a and b map to the same letter.

    Note:

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

    intuition:把word和pattern对应的字符存进map,同一个key只能有一个value(否则false),同一个value也只能对应一个key(否则false),检查两遍

    1,对于每一个word和pattern,首先遍历字符串,把对应字符<word[i], pattern[i]>存入hash table中,这期间如果一个key对应多个value,直接返回false

    2,check map中存的字母是否distinct:用一个boolean数组表示26个小写字母,如果当前字母没有见过,标记为true;如果当前字母见过,直接返回false

    time = O(N * L), space = O(L),   N = words.length, L = pattern.length()

    class Solution {
        public List<String> findAndReplacePattern(String[] words, String pattern) {
            List<String> res = new ArrayList<>();
            for(String word : words) {
                if(match(word, pattern)) {
                    res.add(word);
                }
            }
            return res;
        }
        
        private boolean match(String word, String pattern) {
            Map<Character, Character> map = new HashMap<>();
            for(int i = 0; i < word.length(); i++) {
                char w = word.charAt(i);
                char p = pattern.charAt(i);
                if(!map.containsKey(w)) {
                    map.put(w, p);
                } else if(map.get(w) != p) {
                    return false;
                }
            }
            
            boolean[] seen = new boolean[26];
            for(Map.Entry<Character, Character> entry : map.entrySet()) {
                char val = entry.getValue();
                if(seen[val - 'a']) {
                    return false;
                }
                seen[val - 'a'] = true;
            }
            return true;
        }
    }
  • 相关阅读:
    iOS开发---业务逻辑
    iOS 蓝牙功能 bluetooth
    iOS 企业版 安装失败 原因
    iOS 生命周期 -init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 区别和用途
    iOS 7 修改默认布局从status bar 底部开始
    企业打包时不能安装原因
    UISegmentedControl 功能简单 分析
    ios 推送 证书配置
    ios 获取手机设备信息
    创建quickstart报错
  • 原文地址:https://www.cnblogs.com/fatttcat/p/11358342.html
Copyright © 2011-2022 走看看