• [LeetCode] 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 pso 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

    给一个单词列表和一个模式字符串,从单词数组中找到和字符串模式匹配的单词。与题目205. Isomorphic Strings 类似

    解法:循环单词列表的每一个单词,调用子函数判断是否符合要求。子函数里用哈希表记录每一个字符出现的位置,如果对应的字符出现的位置不一样,就返回False,到最后都一样就返回True。也可以只记录最后一个字符出现的位置,因为之前出现的位置已经比较过了。

    Java:

    public List<String> findAndReplacePattern(String[] words, String pattern) {
            int[] p = F(pattern);
            List<String> res = new ArrayList<String>();
            for (String w : words)
                if (Arrays.equals(F(w), p)) res.add(w);
            return res;
        }
    
        public int[] F(String w) {
            HashMap<Character, Integer> m = new HashMap<>();
            int n = w.length();
            int[] res = new int[n];
            for (int i = 0; i < n; i++) {
                m.putIfAbsent(w.charAt(i), m.size());
                res[i] = m.get(w.charAt(i));
            }
            return res;
        }

    Python:

    # Time:  O(n * l)
    # Space: O(1)
    import itertools
    
    class Solution(object):
        def findAndReplacePattern(self, words, pattern):
            """
            :type words: List[str]
            :type pattern: str
            :rtype: List[str]
            """
            def match(word):
                lookup = {}
                for x, y in itertools.izip(pattern, word):
                    if lookup.setdefault(x, y) != y:
                        return False
                return len(set(lookup.values())) == len(lookup.values())
    
            return filter(match, words)
    

    Python:

    def findAndReplacePattern(self, words, p):
            def F(w):
                m = {}
                for c in w: m[c] = m.get(c, len(m))
                return "".join(chr(m[c] + 97) for c in w)
            return [w for w in words if F(w) == F(p)] 

    Python: Similar to isomorphic string, check the length of the sets and the length of the set when the characters are zipped together.

    b = pattern
    def is_iso(a):
        return len(a) == len(b) and len(set(a)) == len(set(b)) == len(set(zip(a, b)))
    return filter(is_iso, words) 

    C++:

    vector<string> findAndReplacePattern(vector<string> words, string p) {
            vector<string> res;
            for (string w : words) if (F(w) == F(p)) res.push_back(w);
            return res;
        }
    
        string F(string w) {
            unordered_map<char, int> m;
            for (char c : w) if (!m.count(c)) m[c] = m.size();
            for (int i = 0; i < w.length(); ++i) w[i] = 'a' + m[w[i]];
            return w;
        }
    

    C++:  

    // Time:  O(n * l)
    // Space: O(1)
    class Solution {
    public:
        vector<string> findAndReplacePattern(vector<string>& words, string pattern) {
            vector<string> result;
            for (const auto& word: words) {
                if (match(word, pattern)) {
                    result.emplace_back(word);
                }
            }
            return result;
        }
    
    private:
        bool match(const string& word, const string& pattern) {
            unordered_map<char, char> lookup;
            unordered_set<char> char_set;
            for (int i = 0; i < word.length(); ++i) {
                const auto& c = word[i], &p = pattern[i];
                if (!lookup.count(c)) {
                    if (char_set.count(p)) {
                        return false;
                    }
                    char_set.emplace(p);
                    lookup[c] = p;
                }
                if (lookup[c] != p) {
                    return false;
                }
            }
            return true;
        }
    };
    

      

    类似题目:

    [LeetCode] 205. Isomorphic Strings 同构字符串

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    Frequency of String CodeForces
    Sign on Fence CodeForces
    洛谷 P3332 [ZJOI2013]K大数查询 || bzoj3110
    spoj DYNALCA
    洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)
    洛谷 P3203 [HNOI2010]弹飞绵羊 || bzoj2002
    bzoj 1036: [ZJOI2008]树的统计Count
    Shiro Authenticator认证器
    Shiro 十分钟教程
    Shiro 架构
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9795783.html
Copyright © 2020-2023  润新知