【两次过】Lintcode 638. 字符同构

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

样例

给出 s = "egg", t= "add", 返回 true
给出 s = "foo", t= "bar", 返回 false
给出 s = "paper", t= "title", 返回 true

解题思路:

    判断两个字符串是否同构,要点在于字符串S1与S2中的字符只能一一对应,所以需要用两个map记录相互对应关系,S1中的字符a对应S2中的字符b可以表示为map1:<a,b>与map2:<b,a>,当S1再次出现a时,S2对应位置一定是map1中的b;

    我们可以使用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的映射的唯一性进行判断。这里就不一一描述了。

public class Solution {
    /**
     * @param s: a string
     * @param t: a string
     * @return: true if the characters in s can be replaced to get t or false
     */
    public boolean isIsomorphic(String s, String t) {
        // write your code here
        char[] ss = s.toCharArray();
        char[] tt = t.toCharArray();
        
        if(ss.length != tt.length)
            return false;
        
        Map<Character, Character> map1 = new HashMap<>();//s ---> t
        Map<Character, Character> map2 = new HashMap<>();//t ---> s
        
        for(int i=0; i<ss.length; i++){
            if(map1.get(ss[i]) != null && map1.get(ss[i]) != tt[i])
                return false;
            
            if(map2.get(tt[i]) != null && map2.get(tt[i]) != ss[i])
                return false;
            
            map1.put(ss[i], tt[i]);
            map2.put(tt[i], ss[i]);
        }
        
        return true;
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值