第一种想法是如果两个字符串中包含的不重复的字符的数量相等就返回true,否则返回false,看来还是我太天真了,像abb,aab这种就不满足情况。
然后又想到一种方法就是逐个比较字符串的字符,如果不相等的话,就让t字符串中的这个字符全部替换为s字符串中的字符,然后如果在之后的比较中,如果这个被替换的字符再次出现的话,判断是否和s字符串的当前字符相等,如果不相等,那肯定就返回false了,这种方法的话感觉时间会超时,因为在for循环里面还是会用到循环。
所以,对于这种查找的问题,哈希表是一个非常好的选择。我有一起博客讲了哈希表的实现,但是没有用到实处。
这个题目最终的思路就是:先初始化两个数组,t_hash全部元素为0,s_hash全部元素为-1.
bool isIsomorphic(char* s, char* t) {
int s_value,t_value;
int i=0;
int s_hash[127];
int t_hash[127];
memset(t_hash,0,sizeof(t_hash));
memset(s_hash,-1,sizeof(s_hash));
while(i<strlen(s)){
s_value=s[i];
t_value=t[i];
if(s_hash[s_value]==-1){
s_hash[s_value]=t_value; //
if(t_hash[t_value]) return false;
t_hash[t_value]=1;
}else{
if(s_hash[s_value]!=t_value) return false;
}
i++;
}
// for(int i=0;i<strlen(s);i++){
// s_value=s[i];
// t_value=t[i];
// if(s_hash[s_value]==-1){
// s_hash[s_value]=t_value; //
// if(t_hash[t_value]) return false;
// t_hash[t_value]=1;
// }else{
// if(s_hash[s_value]!=t_value) return false;
// }
// }
return true;
}
遗憾的是,超时了。
在网上找了另外一种方法,感觉和自己的差不多,然而人家的却ac了
bool isIsomorphic(char* s, char* t) {
int hash[255]={0};
int index,i,j;
for(i=0;s[i]!='\0';i++)
{
index=s[i];
if(hash[index]==0)
{
for(j=0;j<255;j++)
{
if(hash[j]==t[i])
return false;
}
hash[index]=t[i];
}else
{
if(hash[index]!=t[i])
return false;
}
}
if(t[i]!='\0')return false;
return true;
}