Leetcode 205. 同构字符串

转载自https://www.cnblogs.com/tijie/p/9905287.html

题目:

给定两个字符串 和 t,判断它们是否是同构的。

如果 中的字符可以被替换得到 ,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

示例 1:

输入: s = "egg", t = "add"
输出: true

示例 2:

输入: s = "foo", t = "bar"
输出: false

示例 3:

输入: s = "paper", t = "title"
输出: true

说明:
你可以假设 和 具有相同的长度。

 

解题思路:

1.   JAVA使用HashMap

2.   用一个变量top标记当前出现的字母是第几个,比如 样例的"egg",e是第一个出现的,g是第二个出现的,然后你用一个数组标记这些字符是否出现过,如果出现过,则直接把把他们的顺序赋值到ans1数组内,如果没有则标记他们是第几个出现的

这样子egg在ans1内就是122,foo也是122这样子就是同构的

foo则是122,bar则是123

就不是同构的

 

代码:

int mark[1000001];
int ans1[101000],ans2[010010];
bool isIsomorphic(char* s, char* t)
{
memset(mark,0,sizeof(mark));
memset(ans1,0,sizeof(ans1));
memset(ans2,0,sizeof(ans2));

int len1=strlen(s),len2=strlen(t);
if(len1!=len2)
return false;

int top=1;///记录出现了几个的字符
for(int i=0;i<len1;i++)
{
if(mark[(int)s[i]]==0)
{
mark[(int)s[i]]=top;///标记字符
ans1[i]=mark[(int)s[i]];///赋值
top++;
}
else {

ans1[i]=mark[(int)s[i]];

}
}
memset(mark,0,sizeof(mark));
top=1;
for(int i=0;i<len2;i++)
{
if(mark[(int)t[i]]==0)
{
mark[(int)t[i]]=top;
ans2[i]=mark[(int)t[i]];
top++;
}
else {

ans2[i]=mark[(int)t[i]];

}
}

int flag=0;
for(int i=0;i<len1;i++)
if(ans1[i]!=ans2[i])
return false;

return true;
}

 

思路三:https://img-blog.csdnimg.cn/20181112121533296.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3OTEzODA0,size_16,color_FFFFFF,t_70

posted @ 2019-11-05 13:48  不喜欢吃胡萝卜  阅读(71)  评论(0编辑  收藏  举报