题目:
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.
Note:
You may assume both s and t have the same length.
思路:
使用简单的哈希表映射,可以映射位置也可以映射字符。
代码1:
class Solution {
public:
bool isIsomorphic(string s, string t)
{
int smap[256] = {0};
int tmap[256] = {0};
for(int i = 0 ; i < s.size() ; i++)
{
if(smap[s[i]] == 0 && tmap[t[i]] == 0)
{
smap[s[i]] = t[i];//如果还不存在映射,则映射字符
tmap[t[i]] = s[i];
}
else
{
//如果之前s[i]的映射不等于当前的t[i]或者之前的t[i]映射不等于当前的s[i],则返回假
if(smap[s[i]] != t[i] || tmap[t[i]] != s[i])
return false;
}
}
return true;
}
};
代码2:
class Solution {
public:
bool isIsomorphic(string s, string t)
{
int smap[256] = {0};
int tmap[256] = {0};
for(int i = 0 ; i < s.size() ; i++)
{
//如果之前不存在映射,即都为0或者已经映射过,但是当前映射不同,则返回假。比如之前有映射a->b,smap[97]=tmap[98]=1,如果当前
//映射为a->c,则smap[97]!=tmap[99],所以不符合之前的映射,返回假
if(smap[s[i]] != tmap[t[i]])
return false;
else
{
smap[s[i]] = i + 1;//不能保存i,比如ab和aa。
tmap[t[i]] = i + 1;
}
}
return true;
}
};