You are given two strings s
and sub
. You are also given a 2D character array mappings
where mappings[i] = [oldi, newi]
indicates that you may perform the following operation any number of times:
- Replace a character
oldi
ofsub
withnewi
.
Each character in sub
cannot be replaced more than once.
Return true
if it is possible to make sub
a substring of s
by replacing zero or more characters according to mappings
. Otherwise, return false
.
A substring is a contiguous non-empty sequence of characters within a
Input: s = "fool3e7bar", sub = "leet", mappings = [["e","3"],["t","7"],["t","8"]] Output: true Explanation: Replace the first 'e' in sub with '3' and 't' in sub with '7'. Now sub = "l3e7" is a substring of s, so we return true.
Input: s = "fooleetbar", sub = "f00l", mappings = [["o","0"]] Output: false Explanation: The string "f00l" is not a substring of s and no replacements can be made. Note that we cannot replace '0' with 'o'.
Input: s = "Fool33tbaR", sub = "leetd", mappings = [["e","3"],["t","7"],["t","8"],["d","b"],["p","b"]] Output: true Explanation: Replace the first and second 'e' in sub with '3' and 'd' in sub with 'b'. Now sub = "l33tb" is a substring of s, so we return true.
1 <= sub.length <= s.length <= 5000
0 <= mappings.length <= 1000
mappings[i].length == 2
oldi != newi
s
andsub
consist of uppercase and lowercase English letters and digits.oldi
andnewi
are either uppercase or lowercase English letters or digits.
impl Solution {
pub fn match_replacement(s: String, sub: String, mappings: Vec<Vec<char>>) -> bool {
let s = s.as_bytes();
let sub = sub.as_bytes();
let mut bitmappings = [0_i128; 128];
for i in 0..mappings.len() {
let (old, new) = (mappings[i][0] as usize, mappings[i][1] as usize);
bitmappings[old] |= 1 << new;
}
for i in 0..=s.len() - sub.len() {
let mut flag = true;
for j in 0..sub.len() {
if sub[j] != s[i + j] && bitmappings[sub[j] as usize] & (1 << s[i + j]) == 0 {
flag = false;
break;
}
}
if flag {
return true;
}
}
false
}
}