205. 同构字符串
题目:
思路:
【1】利用哈希的方式模拟,
【2】利用下标的方式进行比对
代码展示:
【1】利用哈希的方式模拟,
//时间22 ms 击败 33.69% //内存40.4 MB 击败 82.61% //时间复杂度:O(n),其中 n 为字符串的长度。我们只需同时遍历一遍字符串 s 和 t 即可。 //空间复杂度:O(∣Σ∣),因为最好的情况就是只存储一个字符,最坏的情况是存储全部字符。 class Solution { public boolean isIsomorphic(String s, String t) { // 同构情况下长度须相等 if (s.length() != t.length()) return false; // 每一组数据都要对应的映射,如 s = "paper", t = "title" 结果是true // 说明s中的映射e->l, 而t中的映射e->r,是互不干扰的,故是两组映射 Map<Character, Character> s2t = new HashMap<Character, Character>(); Map<Character, Character> t2s = new HashMap<Character, Character>(); int len = s.length(); for (int i = 0; i < len; ++i) { char x = s.charAt(i), y = t.charAt(i); if ((s2t.containsKey(x) && s2t.get(x) != y) || (t2s.containsKey(y) && t2s.get(y) != x)) { return false; } s2t.put(x, y); t2s.put(y, x); } return true; } }
【2】利用下标的方式进行比对
//时间2 ms 击败 98.68% //内存40.4 MB 击败 82.61% //时间复杂度:O(n),其中 n 为字符串的长度。我们只需同时遍历一遍字符串 s 和 t 即可。 //空间复杂度:O(1),因为需要的数组大小是固定的即常量。 class Solution { public boolean isIsomorphic(String s, String t) { char[] sc = s.toCharArray(); char[] tc = t.toCharArray(); // 由于出现的字符都由 ASCII 字符组成,所以固定最多出现256个字符 int[] si = new int[256]; int[] ti = new int[256]; for(int i = 0; i < sc.length; i++) { // 如果两个字符的下标不对应则说明出现了不同的映射 // 如果是0则说明还没生成映射关系 if (si[sc[i]] != ti[tc[i]]) { return false; } //这里进行+1是用于表示位置,因为int数组默认初始化是0,所以不能用0进行比对 si[sc[i]] = i + 1; ti[tc[i]] = i + 1; } return true; } }