同构字符串(力扣第205题)

题目:

给定两个字符串 s 和 t,判断它们是否是同构的。

如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

 分析:

需要注意的点是:

1、s中如果某个字符是多次出现的,那么这些重复出现的字符只能被t中的出现同样次数的字符替换,否则替换完成之后,s得不到t;

2、s中被替换字符的顺序坐标必须是和t中替换的字符顺序坐标是一致的,否则即使替换完成,通过s也得不到t;

基于以上两点,我们同时遍历两个字符串,判断当前访问的字符,其上一次被访问的时候的在s和t中的坐标是否相同,如果不同则说明不是同构的,相同则继续向后遍历,直到两个字符串中的所有字符全部遍历完成。

具体实现可以借助于哈希表或者通过Int数组模拟哈希(因为char字符都是有对应的数值的)

代码实现:

方法一:

 public boolean isIsomorphic(String s, String t) {

        HashMap<Character, Integer> hashMap_s = new HashMap<>();
        HashMap<Character, Integer> hashMap_t = new HashMap<>();

        for (int i = 0; i < s.toCharArray().length; i++) {

            if ( hashMap_s.get(s.charAt(i)) == null && hashMap_t.get(t.charAt(i)) == null ){
                hashMap_s.put(s.charAt(i),i);
                hashMap_t.put(t.charAt(i),i);
            } else if (hashMap_s.get(s.charAt(i)) != null && hashMap_t.get(t.charAt(i)) != null){
                int last_s = hashMap_s.get(s.charAt(i));
                int last_t = hashMap_t.get(t.charAt(i));
                if ( last_s != last_t){
                    return false;
                }

                hashMap_s.put(s.charAt(i),i);
                hashMap_t.put(t.charAt(i),i);
            }else {
                return false;
            }

        }

        return true;
    }

该方法可行,但是超时了,所以方法二更好一些。

方法二:

    public boolean isIsomorphic2(String s,String t){
        int[] preIndexOfS = new int[256];
        int[] preIndexOfT = new int[256];
        for (int i = 0; i < s.length(); i++) {
            char sc = s.charAt(i), tc = t.charAt(i);
            if (preIndexOfS[sc] != preIndexOfT[tc]) {
                return false;
            }
            preIndexOfS[sc] = i + 1;
            preIndexOfT[tc] = i + 1;
        }
        return true;
    }
原文地址:https://www.cnblogs.com/yxym2016/p/13971642.html