LeetCode 205. Isomorphic Strings HashMap的应用

12 篇文章 0 订阅
10 篇文章 0 订阅

    第一种想法是如果两个字符串中包含的不重复的字符的数量相等就返回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;   
}

    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值