#890
Medium Algorithms Find and replace pattern
Array Hash Table String
77.0% acceptance
Feb 22, 2026
4025
174
Given a list of strings words and a string pattern, return a list of words[i] that match pattern. You may return the answer in any order.
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.
Solution
Rust
Time O(2^n)
Space O(n)
/*
* Given a list of strings words and a string pattern, return a list of words[i] that match pattern. You may return the answer in any order.
* 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.
* 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.
* Example 2:
* Input: words = ["a","b","c"], pattern = "a"
* Output: ["a","b","c"]
* Constraints:
* 1 <= pattern.length <= 20
* 1 <= words.length <= 50
* words[i].length == pattern.length
* pattern and words[i] are lowercase English letters.
*/
impl Solution {
fn normalize(s: &str) -> Vec<usize> {
let mut map = std::collections::HashMap::new();
let mut cnt = 0usize;
s.chars().map(|c| {
let n = map.entry(c).or_insert_with(|| { let v = cnt; cnt += 1; v });
*n
}).collect()
}
pub fn find_and_replace_pattern(words: Vec<String>, pattern: String) -> Vec<String> {
let pat = Self::normalize(&pattern);
words.into_iter().filter(|w| Self::normalize(w) == pat).collect()
}
}