Leetcode 205. 同构字符串
转载自https://www.cnblogs.com/tijie/p/9905287.html
题目:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = "egg",
t = "add"
输出: true
示例 2:
输入: s = "foo",
t = "bar"
输出: false
示例 3:
输入: s = "paper",
t = "title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
解题思路:
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