给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s ="egg",
t ="add"
输出: true
示例 2:
输入: s ="foo",
t ="bar"
输出: false
示例 3:
输入: s ="paper",
t ="title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
错误样例(TLE)
class Solution { public boolean isIsomorphic(String s, String t) { int cnt = 0; for(int i = 0;i < s.length(); ++i) { //if(s.charAt(i) != '*' && s.charAt(i) != '/') { char c = (char)(cnt%10); System.out.println(c); //if(cnt %2 == 0) c = '/'; s = s.replace(s.charAt(i),c); cnt++; // } } cnt = 0; for(int i = 0;i < t.length(); ++i) { //if(t.charAt(i) != '*' && t.charAt(i) != '/') { char c = (char)(cnt%10); //if(cnt %2 == 0) c = '/'; t = t.replace(t.charAt(i),c); cnt++; // } } // System.out.println(s); // System.out.println(t); if(s.equals(t)) return true; else return false; } }
正解:建一个map保存映射关系, 同时用一个set保持被映射的char, 保证同一个char 不会被映射两次。
public boolean isIsomorphic2(String s, String t) { if (s == null || t == null) return false; if (s.length() != t.length()) return false; Map<Character, Character> map = new HashMap<Character, Character>(); Set<Character> set = new HashSet<Character>(); char c1, c2; for (int i = 0; i < s.length(); i++) { c1 = s.charAt(i); c2 = t.charAt(i); if (map.containsKey(c1)) { if (map.get(c1) != c2) return false; } else { if (set.contains(c2)) return false; else { map.put(c1, c2); set.add(c2); } } } return true; }
public boolean isIsomorphic2(String s, String t) { if (s ==null|| t ==null) returnfalse; if (s.length() != t.length()) returnfalse; Map<Character, Character>map=new HashMap<Character, Character>(); Set<Character>set=new HashSet<Character>(); char c1, c2; for (int i =0; i < s.length(); i++) { c1 = s.charAt(i); c2 = t.charAt(i); if (map.containsKey(c1)) { if (map.get(c1) != c2) returnfalse; } else { if (set.contains(c2)) returnfalse; else { map.put(c1, c2); set.add(c2); } } } returntrue; }