题目:
给定两个字符串 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; }