前言:内容包括:题目,代码实现,大致思路,代码解读
题目:
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
代码实现:
bool isIsomorphic(char * s, char * t)
{
int len = strlen(s);
char arr1[200] = {0};
char arr2[200] = {0};
int i = 0;
for(i=0;i<len;i++)
{
if(arr1[s[i]]==0 && arr2[t[i]]==0)
{
arr1[s[i]] = t[i];
arr2[t[i]] = 1;
}
else if(arr1[s[i]]!=t[i])
{
return false;
}
}
return true;
}
大致思路:
e--->a
g--->d
g--->d
e只对应a,g只对应d
都是一一对应
f--->b
o--->a
o--->r
f只对应b
o对应了a,对应了r 由于不是一一对应,所以不是同构
1 同时遍历s和t两个字符串,以遍历到的s的字符作为下标(字符的本质是ASCII码值),若它唯一标识的空间内没有置入t的字符,则将同位置的t字符串字符置入这个空间,同时标记这个t字符串中的字符,表示它已经有对应关系
2 若是s的字符为下标唯一标识的空间内有字符了,则判断这个空间的字符是否和现在遍历到的t的字符相同,若是不同,则对应不唯一,不是同构字符串
代码解读:
part 1
char arr1[200] = {0};
char arr2[200] = {0};
arr1:存储s的字符的对应对象
arr2:标识t的字符是否有对应关系
part 2
for(i=0;i<len;i++)
{
if(arr1[s[i]]==0 && arr2[t[i]]==0)//s的字符没有对应对象,并且同位置上的t的字符也没有对应关系
{
arr1[s[i]] = t[i];//s的字符的对应对象匹配t的字符
arr2[t[i]] = 1;//该t的字符已有对应关系
}
else if(arr1[s[i]]!=t[i])//s的字符已有对应对象 且这个对象不是当前的t的字符
{
return false;
}
}
return true;