📅  最后修改于: 2023-12-03 15:40:32.285000             🧑  作者: Mango
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序,不可改变字符的类型。
例如,给定 "egg", "add",返回 true;给定 "foo", "bar",返回 false。
该题的关键在于如何判断两个字符串是否同构,即如何进行对应关系的匹配。
我们可以利用一个HashMap来维护字符到字符的映射,从而判断两个字符串是否同构。
具体步骤如下:
首先遍历两个字符串,若长度不等则直接返回false。
声明两个HashMap,分别存储字符到字符的映射,遍历字符串,比较当前字符的映射情况。
如果当前字符c在第一个字符串中出现过,那么需要检查与第二个字符串中对应位置的字符是否相同,不同则不是同构的,返回false。
如果当前字符c在第二个字符串中出现过,那么需要检查与第一个字符串中对应位置的字符是否相同,不同则不是同构的,返回false。
如果当前字符c在两个字符串中都没出现过,则将它们同时加入到对应的HashMap中。
如果遍历完字符串后没有返回false,则说明两个字符串是同构的,返回true。
public boolean isIsomorphic(String s, String t) {
if (s.length() != t.length()) {
return false;
}
Map<Character, Character> sToTMap = new HashMap<>();
Map<Character, Character> tToSMap = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
char sc = s.charAt(i), tc = t.charAt(i);
if (sToTMap.containsKey(sc) && sToTMap.get(sc) != tc) {
return false;
}
if (tToSMap.containsKey(tc) && tToSMap.get(tc) != sc) {
return false;
}
sToTMap.put(sc, tc);
tToSMap.put(tc, sc);
}
return true;
}
该算法时间复杂度为O(n),空间复杂度为O(n)。