使用C ++中的map进行迭代差异

时间:2015-10-14 00:52:41

标签: c++ string dictionary iteration

我正在尝试解决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;
} 
};

2 个答案:

答案 0 :(得分: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;

在你的第一个循环中

答案 1 :(得分:0)

  

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

     

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

     

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

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

让我们将此逻辑应用于您评论的部分中的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