携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
1.描述
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
- 1 <= s.length <= 5 * 10^4
- t.length == s.length
- s 和 t 由任意有效的 ASCII 字符组成
2.分析
判断条件共两个 1.不同字符不能映射到同一字符上 2.相同字符只能映射到同一字符上 借助两个数组dict[128]和flag[128];
dict数组存储映射关系,其初始值均为-1。针对一组新的映射关系,如a->d,则dict[a]=d;若非新的映射关系,例如出现a->X(X代表变量),判断if(X==d),若相等,则符合;否则,则代表出现判断条件2,相同字符映射到不同的字符上,错误。
借助flag数组判断条件(1)不同字符只能映射到同一字符,如出现映射关系a->d,则将flag[d]++,代表出现一组映射到d的关系。最后判断flag数组时候存在数值>1。若出现数值flag[X]=2,代表映射到X的关系至少存在两组,与规则不符。
3.AC代码
bool isIsomorphic(char * s, char * t){
int i,dict[128],flag[128],length=strlen(s);
for (i=0; i<128; i++){//判断数组初始化
dict[i] = -1;//因为均为ascall码,0-127,使用-1代表从未出现过该关系
flag[i] = 0;//映射关系数量为0
}
for (i=0; i<length; i++){
if (dict[s[i]] == -1){//出现一组新的映射关系a->d,为其赋值dicr[a]=d,同时映射到d位置的数量加1
dict[s[i]] = t[i];
flag[t[i]] ++;
}else{//已经出现过映射关系,a->X,判断d ==X ,不等则错误
if (dict[s[i]]!=t[i]){
return false;
}
}
}
for (i=0; i<128; i++){//判断映射到d的关系是否只有一组
if (flag[i] > 1){
return false;
}
}
return true;
}