此题是比较两字符串是否是同一模式,如abb和cdd匹配成功。
其核心是内在模式是否一致,字符是否相同并不影响其结果,故我们需要将字符映射到同一个可以比较的特征域去。
1)按各字符第一次出现的次序数字存入字典,每一次比较该数值是否相同
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.empty())
return true;
map<char,char> ms,mt;
int sindex=0,tindex=0;
for(int i=0;i<s.size();i++)
{
if(ms.find(s[i])==ms.end())
{
ms[s[i]]=sindex+'0';
s[i]=sindex+'0';
sindex++;
}
else
{
s[i]=ms[s[i]];
}
if(mt.find(t[i])==mt.end())
{
mt[t[i]]=tindex+'0';
t[i]=tindex+'0';
tindex++;
}
else
{
t[i]=mt[t[i]];
}
if(s[i]==t[i])
continue;
else
return false;
}
return true;
}
};
2)上述代码map每次需要查询是否存在当前字符,查找效率很低
使用char m[128]数组代替字典
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.empty())
return true;
char ms[128]={0};
char mt[128]={0};
int sindex=1,tindex=1;
for(int i=0;i<s.size();i++)
{
if(ms[s[i]]==0)
{
ms[s[i]]=sindex;
sindex++;
}
if(mt[t[i]]==0)
{
mt[t[i]]=tindex;
tindex++;
}
if(ms[s[i]]!=mt[t[i]])
return false;
}
return true;
}
};
优化上述代码后
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.empty())
return true;
char ms[128]={0};
char mt[128]={0};
int index=1;
for(int i=0;i<s.size();i++)
{
if(ms[s[i]]!=mt[t[i]])
return false;
if(ms[s[i]]==0)
{
ms[s[i]]=index;
mt[t[i]]=index;
index++;
}
}
return true;
}
};