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