LeetCodeDay13----同构字符串

题目:给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:输入: s = "egg", t = "add"。输出: true
示例 2:输入: s = "foo", t = "bar"。输出: false
示例 3:输入: s = "paper", t = "title"。输出: true
说明:
你可以假设 s 和 t 具有相同的长度。

思路:

方法一:用数组实现:因为ASCII码只有256,所以新建两个数组,数组长为256,值为元素出现的次数,下标为该字符的ASCII码。遍历原字符串,如果字符串S里面的第i个元素出现的次数和字符串T里面的第i元素出现的次数不同,直接返回false,否则分别将两数组中下标为该字符的元素值加一。  
方法二:用HashMap实现:新建一个HashMap,其中key存储的是字符串S中的字符,value存储的是字符串T中的字符。两个字符串对应位置的字符构成键值对添加到HashMap中,若s[i]已经在HashMap存在但值并不是t[i],则不是同构;若s[i]不存在但t[i]已经存在于值表中也不是同构。

源码:GitHub源码

方法一:

class Solution {
    public boolean isIsomorphic(String s, String t) {
        int[] m1 = new int[256];
        int[] m2 = new int[256];
        int n = s.length(); 
        for (int i = 0; i < n; ++i) {
            if (m1[s.charAt(i)] != m2[t.charAt(i)]) return false;
            m1[s.charAt(i)] = i + 1;
            m2[t.charAt(i)] = i + 1;
        }
        return true;
    }
}

方法二:

class Solution {
    public boolean isIsomorphic(String s, String t) {
         Map map = new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
        if (map.containsKey(s.charAt(i))) {
            if (map.get(s.charAt(i)) != t.charAt(i)) return false;
        } else if (map.containsValue(t.charAt(i))) return false;
        map.put(s.charAt(i), t.charAt(i));
    }
    return true;
    }
}

你可能感兴趣的:(LeetCodeDay13----同构字符串)