字符串同构

字符串同构

题目描述:
给定两个字符串 s 和 t ,确定它们是否是同构的。
两个字符串是同构的如果 s 中的字符可以被替换得到 t。
所有出现的字符必须用另一个字符代替,同时保留字符串的顺序。 没有两个字符可以映射到同一个字符,但一个字符可以映射到自己。

注意事项:
你可以假定两个字符串 s 和 t 是一样长度的.

样例:
给出 s = “egg”, t= “add”, 返回 true。
给出 s = “foo”, t= “bar”, 返回 false。
给出 s = “paper”, t= “title”, 返回 true。

  #include<bits/stdc++.h>
    using namespace std;
    bool isIsomorphic(string s, string t) {
        // write your code here
        int lens=s.length();
        map<char,char>hashmap1;
        int flag1=0;
        for(int i=0;i<lens;i++)//s到t映射唯一性的判断
        {
            if(i==0){
                hashmap1[s[i]]=t[i];
            }else{
                if(hashmap1.find(s[i])==hashmap1.end()){
                    hashmap1[s[i]]=t[i];
                }else{
                    if(hashmap1[s[i]]!=t[i]){
                        flag1=1;
                        break;
                    }
                }
            }
        }
        map<char,char>hashmap2;
        int flag2=0;
        for(int i=0;i<lens;i++){//t到s映射唯一性的判断
            if(i==0){
                hashmap2[t[i]]=s[i];
            }else{
                if(hashmap2.find(t[i])==hashmap2.end()){
                    hashmap2[t[i]]=s[i];
                }else{
                    if(hashmap2[t[i]]!=s[i]){
                        flag2=1;
                    }
                }
            }
        }
        if(flag1+flag2==0)//两个都唯一时,才同构
            return true;
        else
            return false;
    }
    void travelmap(map<char,char>hashmap){//哈希表的遍历
        map<char,char>::iterator iter;
        for(iter = hashmap.begin(); iter != hashmap.end(); ++iter)
            cout<<iter->first<<" "<<iter->second<<endl;
    }
    int main(){
        string s,t;
        cin>>s>>t;
        cout<<isIsomorphic(s,t)<<endl;
        return 0;
    }

思路讲解:
由于,没有两个字符可以映射到同一个字符,即一对一的映射,所以我就想到了使用哈希表中的map函数,我们可以使用map将s[i]和t[i]对应的添加到哈希表中,但每次添加我们需要查找一下s[i]是否存在于哈希表中,如果不存在就添加,存在就看s[i]映射的字符是否与t[i]相等,如果不等则说明多个字符映射到同一个字符上了,故这两个字符不同构。但是这样我们只检查了s[i]到t[i]的映射,只确定了s[i]—->t[i]的唯一性,我们也要确定t[i]—->s[i]的映射是否唯一。只有这两个相互映射唯一,我们才能说这是同构的。
可能有些人会怀疑是否还需要对t到s的映射的唯一性进行判断,这里我给出一个反例就可以了,例eggs和adda,可以看出s到t的映射的唯一是唯一的,但是这两个字符串却不是同构的。所以我们还需要对t到s的映射的唯一性进行判断
举个例子:
例:egg与add
首先我们将e->a添加进哈希表,然后查找g是否存在哈希表中,不存在就将其g->d添加进哈希表,然后在判断g是否存在哈希表中,存在就将g映射的字符与d比较如果相同就说明s到t映射唯一,反之说明不唯一。然后我们也需要对t到s的映射的唯一性进行判断。这里就不一一描述了。
简单来说,互相添加映射就可以了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值