字符串---Leetcode205. 同构字符串

题目:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = “egg”, t = “add”
输出: true

示例 2:
输入: s = “foo”, t = “bar”
输出: false

示例 3:
输入: s = “paper”, t = “title”
输出: true

说明:
你可以假设 s 和 t 具有相同的长度。

本题思路:一种思路是map建立映射关系,一个key对应一个value,但是需要注意的一个问题是对于这道题,我们需要验证 s - > t 和 t -> s 两个方向即可。如果验证一个方向,是不可以的。举个例子,s = ab, t = cc,如果单看 s -> t ,那么 a -> c, b -> c 是没有问题的。必须再验证 t -> s,此时,c -> a, c -> b,一个字母对应了多个字母,所以不是同构的。
代码:

public boolean isIsomorphic(String s, String t) {
    return isIsomorphicHelper(s, t) && isIsomorphicHelper(t, s);

}

private boolean isIsomorphicHelper(String s, String t) {
    int n = s.length();
    HashMap<Character, Character> map = new HashMap<>();
    for (int i = 0; i < n; i++) {
        char c1 = s.charAt(i);
        char c2 = t.charAt(i);
        if (map.containsKey(c1)) {
            if (map.get(c1) != c2) {//map中一定要加上泛型,不然会出错
                return false;
            }
        } else {
            map.put(c1, c2);
        }
    }
    return true;
}

第二种解法:

public boolean isIsomorphic(String s, String t) {
    int n = s.length();
    int[] mapS = new int[128];
    int[] mapT = new int[128];
    for (int i = 0; i < n; i++) {
        char c1 = s.charAt(i);
        char c2 = t.charAt(i);
        //当前的映射值是否相同
        if (mapS[c1] != mapT[c2]) {
            return false;
        } else {
            //是否已经修改过,修改过就不需要再处理
            if (mapS[c1] == 0) {
                mapS[c1] = i + 1;
                mapT[c2] = i + 1;
            }
        }
    }
    return true;
}

我拿到这个题目的思路是:这道题是判断两个字符串是不是同构,也就说判断是不是同一种结构,所以我的想法是建立一个数组,用来记录字符串的结构,从1开始取当前位置字符串和前面的字符串进行比较,如果当前位置和前面位置有相同的字符,则把当前位置的值设为前面相同字符的位置(下标),如果前面字符没有与之相同的则设置为当前字符的下标;0位置默认为0。最后形成这个字符的结构数组,同理,生成第二个字符串的结构数组,最后在判断两个字符数组是否相等,相等则表示两个字符串是同一个结构,不相等的话则表示不是同一个结构return false。不过没有通过所有的测试案例,我也一直在思考问题出在哪里。。。。代码就不贴出来了,毕竟这个思路还没有ac。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值