【问题标题】:How is w1_to_w2.count and w2_to_w1.count workingw1_to_w2.count 和 w2_to_w1.count 是如何工作的
【发布时间】:2021-06-10 15:27:42
【问题描述】:
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;
    }
};

输入:
words = ["abc","deq","mee","aqq","dkd","ccc"]
模式=“abb”

输出:
["mee","aqq"]

说明:
“mee” 匹配该模式,因为有一个排列 {a -&gt; m, b -&gt; e, ...}。 “ccc”与模式不匹配,因为{a -&gt; c, b -&gt; c, ...} 不是排列,因为a 和b 映射到同一个字母。

这是如何工作的,尤其是count?请逐步解释。

【问题讨论】:

标签: c++ unordered-map


【解决方案1】:

findAndReplacePattern(words, p) 只需为 words 中的每个 word 调用 match(word, p) - 如果它们匹配,则 word 是附加到ans,稍后返回。

在 match(w1, w2) 中,w1_to_w2 和 w2_to_w1 最初是空的,i 沿着两个字符串计数(假设它们的长度相同 - 通常是一个危险的假设,可能导致程序崩溃)。

在i 为 0 的第一次迭代中,.count(...) 调用返回 0,因为 unordered_maps 中没有任何内容,因此函数不会返回。相反,如果评估 else 子句,该子句记录:

  • w1 中的第一个字母 - w1[0] - 对应于 w2 中的第一个字母,通过分配 w1_to_w2[w1[i]] = w2[i],并且
  • w2 中的第一个字母 - w2[0] - 对应于 w1 中的第一个字母,通过分配 w2_to_w1[w2[i]] = w1[i]。

当它沿着单词中的其余字母前进时......

w1_to_w2.count(w1[i]) && w1_to_w2[w1[i]] != w2[i]

...是说如果我们已经在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]

...如果我们之前在 w2 中看到与 w2[i] 相同的字母,并且之前对应的 w1 中的字母(即w2_to_w1[w2[i]])与现在对应的字母不同(即w1[i]),这将是返回false的另一个原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多