题目描述
Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
For example,
- Given “egg”, “add”, return true.
- Given “foo”, “bar”, return false.
- Given “paper”, “title”, return true.
- Given “ab”, “aa”, return false. ⇒ a->a and b->a
Note: You may assume both s and t have the same length.
本题比较简单,不必考虑两个字符串长度不同的情况。遍历字符串,使用map得到两个字符串中字符的映射,若新出现的字符对与map中保存的不同,则返回false。
需要注意,使用一个map对于 “ab”, “aa” 的情况可能无法判断,因为从a->a 和 b->a的key是不一样的,在map中无法查找到,而反过来则是 a->a 和 a->b显然是错误的,因此,我们可以对两个字符串分别作为map的key,进行两次判断,避免错误的发生。
另一种做法是,仅使用一个字符串作为map的key,但是使用一个set保存每个key的value。若处理完成后,set中元素个数小于map元素个数,则说明存在两个不同的key映射到了同一个value情况,返回false.
代码
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.size() != t.size())
return false;
unordered_map<char, char> stringMap;
for(size_t i = 0; i != s.size(); ++i)
{
char sc = s[i];
char tc = t[i];
if (stringMap.find(sc) == stringMap.end())
{
stringMap[sc] = tc;
}
else
{
if (stringMap[sc] != tc)
return false;
}
}
unordered_set<char> stringSet;
unordered_map<char, char>::iterator it = stringMap.begin();
for(; it != stringMap.end(); ++it)
{
if (stringSet.find(it->second) != stringSet.end())
return false;
else
stringSet.insert(it->second);
}
return true;
}
};