class Solution {
public:
vector<string> findAndReplacePattern(vector<string>& words, string p) {
vector<string> ans;
for(auto &w:words){
if(match(w,p))
ans.push_back(w);
}
return ans;
}
bool match(string &w1,string &w2){
unordered_map<char,char>w1_to_w2,w2_to_w1;
for( i=0;i<w1.size();i++)
if( (w1_to_w2.count(w1[i]) && w1_to_w2[w1[i]] != w2[i]) ||
(w2_to_w1.count(w2[i]) && w2_to_w1[w2[i]] != w1[i]) )
return false;
else
w1_to_w2[w1[i]] = w2[i],
w2_to_w1[w2[i]] = w1[i];
return true;
}
};输入:
单词= "abc","deq","mee","aqq","dkd","ccc“
pattern = "abb“
输出:
"mee","aqq“
解释:
"mee“与模式匹配,因为有一个排列{a -> m, b -> e, ...}。"ccc“与模式不匹配,因为{a -> c, b -> c, ...}不是一个排列,因为a和b映射到同一个字母。
这是如何工作的,尤其是count?请一步一步地解释。
发布于 2021-06-13 23:56:24
findAndReplacePattern(words, p)只是为words中的每个单词调用match( word , p) -如果它们匹配,则将单词附加到ans,后者稍后将返回。
在match(w1, w2)中,w1_to_w2和w2_to_w1最初是空的,i会沿着这两个字符串计数(假设这两个字符串的长度相同-这通常是一个危险的假设,可能会导致程序崩溃)。
在第一次迭代中,当i为0时,.count(...)调用返回0,因为unordered_maps中没有任何内容,所以函数不返回。取而代之的是if计算else子句,该子句记录:
通过执行赋值w2_to_w1[w2[i]] = w1[i].,
w1中的第一个字母- w1[0] -对应于w2中的第一个字母,w2中的第一个字母-<代码>D21-对应于<代码>D22中的第一个字母当它沿着单词中的其他字母移动时...
w1_to_w2.count(w1[i]) && w1_to_w2[w1[i]] != w2[i]...is说,如果我们已经在w1中看到了与w1[i]相同的字母,而它在w2中对应的字母(即w1_to_w2[w1[i]])与现在对应的字母(即w2[i])不同,这将是返回false的一个原因,或者...
w2_to_w1.count(w2[i]) && w2_to_w1[w2[i]] != w1[i]...if我们已经在w2中看到了与w2[i]相同的字母,并且之前在w1中它所对应的字母(即w2_to_w1[w2[i]])与现在所对应的字母(即w1[i])不同,这将是返回false的另一个原因。
https://stackoverflow.com/questions/67924191
复制相似问题