【问题标题】:iteration difference using map in C++在 C++ 中使用 map 的迭代差异
【发布时间】:2016-01-11 22:15:05
【问题描述】:

我正在尝试解决 leetcode 中的Isomorphic Strings 问题。

我来到下面的代码,问题是注释块应该与未注释的迭代功能相同,但它无法返回正确的答案。但是,当前代码可以通过测试。为什么有区别?谢谢。

"aa""ab" 应该返回 false。

class Solution {
public:
    bool isIsomorphic(string s, string t) {

    if(s.size() != t.size())
        return false;

    map<char, int> ms;
    map<char, int> mt;

/*  for(int i = 0; i < s.size(); i++)
    {
        if(ms[s[i]] != mt[t[i]])
           return false;
        else
            ms[s[i]] = mt[t[i]] = i;
    }
*/      

    int n = s.size();
    int i = n;

    for (; i >= 0 ; --i) {
        if (ms[s[n-i]] != mt[t[n-i]])/*|| s[i] == t[i]*/
            return false;
        else
            ms[s[n-i]] = mt[t[n-i]] = i;
    }
    return true;
} 
};

【问题讨论】:

  • 在我看来完全一样。 Ideone 同意:ideone.com/dBVA5V
  • 试试 "aa" "ab" 。谢谢。
  • 如果钥匙不在地图上,你认为map[key] 是什么?

标签: c++ string dictionary iteration


【解决方案1】:

您的第一个(已注释掉的)for 循环将循环 s.size() 次(从 0 到 s.size()-1 包括在内)。

您的第二个 for 循环将循环 s.size() + 1 次(从 s.size() 到 0 包括在内)。

编辑:这不是您未通过测试的原因,而是两者之间的区别。

您未通过测试的原因是 @T.C.说-如果地图不包含字符,则 map[key] 返回 0(在您的情况下),但是您使用 0 作为找到的第一个字母的值。所以您的代码无法区分第一个字母和未找到的字母。

您的第二个循环起作用的原因是您使用的i 不是 0(除了在最后一个无效的迭代中),因此您不会遇到第一个字母之间的冲突并且找不到。

一个简单的解决方案是使用

ms[s[i]] = mt[t[i]] = i+1;

在你的第一个循环中

【讨论】:

  • 差别不大。
【解决方案2】:

mapped_type& operator[] (const key_type& k); 访问元素

如果 k 匹配容器中某个元素的键,则函数 返回对其映射值的引用。

如果 k 不匹配容器中任何元素的键,则 函数使用该键插入一个新元素并返回一个引用 到它的映射值。请注意,这总是会增加容器 大小加一,即使没有为元素分配映射值( 元素是使用其默认构造函数构造的)。

注意:整数的默认构造将其设置为零。

让我们将此逻辑应用于您评论部分中的 s="aa" 和 t="ab":

for(int i = 0; i < s.size(); i++)
    {
        if(ms[s[i]] != mt[t[i]])
           return false;
        else
            ms[s[i]] = mt[t[i]] = i;
    }

i = 0:两个映射都是空的,所以我们插入 ms['a'] = 0 和 mt['a'] = 0,比较表明它们是相等的。那么它们都设置为i,即:0

i = 1: ms['a'] 发现之前已经设置为 0,mt['b'] 未找到但插入 = 0。但相等成功,然后都设置为 1。

循环结束,成功。

问题出在哪里:如果在第 2 步发现 ms[a] 的值不同,则测试不会成功。

解决方案:不要在地图中使用零作为值。使用任何值,例如 i+10。

ms[s[i]] = mt[t[i]] = i + 10

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多