问题描述
解题思路
把两个字符串每个字符都重新映射到一个新的字符组成一个新的字符串,再比较新字符串是否相等就知道原字符串是否同构。
注意:这题字符串不止有小写字母。
所以映射这个ascii集合,开个128大小的数组。
映射思路:
待映射的下标从0-128(ascii码范围)
扫描两个字符串,遇到一个新字符给他分配一个新的下标,否则就用已经有的映射关系。
比如egg开始映射
第一步:e新字符,分配下标0
第二步:g新字符,分配下标1
第三步:g已经存在映射关系直接取值用
egg->0 1 1(单个整数表示一个ascii码值,具体查表看,不影响做题!!!)
add开始映射:
第一步:a新字符,分配下标0
第二步:d新字符,分配下标1
第三步:d已经存在映射关系直接取值用
add->0 1 1
比较一下0 1 1 == 0 1 1
所以同构的
C++实现
class Solution {
public:
bool isIsomorphic(string s, string t) {
string sp,tp;
int smap[130],tmap[130];
memset(smap,-1,sizeof(smap));
memset(tmap,-1,sizeof(tmap));
int ss = 0;
int tt = 0;
int l1 = s.size();
int l2 = t.size();
for(int i = 0;i < l1;i++){
if(smap[s[i]]==-1)
smap[s[i]] = ss++;
sp.push_back((char)smap[s[i]]);
}
for(int i = 0;i < l2;i++){
if(tmap[t[i]]==-1)
tmap[t[i]] = tt++;
tp.push_back((char)tmap[t[i]]);
}
return sp == tp;
}
};