【刷题打卡】205. 同构字符串

94 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

1.描述

205. 同构字符串

给定两个字符串 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;
}