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;
    }
}

 

posted @ 2023-06-27 16:31  忧愁的chafry  阅读(59)  评论(0编辑  收藏  举报