import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param t string字符串
     * @return string字符串
     */
    public String isIsomorphic (String s, String t) {
        // write code here
        if (s.length() != t.length()) {
            return "NO";
        }

        Map<Character, Character> map = new HashMap<>();

        for (int i = 0; i < s.length(); i++) {
            char sChar = s.charAt(i);
            char tChar = t.charAt(i);

            if (map.containsKey(sChar)) {
                if (map.get(sChar) != tChar) {
                    return "NO";
                }
            } else {
                // 检查 tChar 是否已经被映射过,如果是,则说明存在不同字符映射到同一个字符的情况,返回 "NO"
                if (map.containsValue(tChar)) {
                    return "NO";
                }
                map.put(sChar, tChar);
            }
        }

        return "YES";
    }
}

该题考察的知识点是字符串处理和哈希表的应用。

在代码中,我使用哈希表来建立字符的映射关系。遍历两个字符串,对于每个字符,检查它们在哈希表中的映射关系是否满足同构定义的要求。

判断两个字符串的长度是否相等,如果不相等则直接返回 "NO",因为不可能存在一一映射的关系。

初始化一个空的哈希表 map 来存储字符的映射关系。

遍历字符串 s 和 t,对于每个字符,进行以下操作:

  • 如果字符 sChar 已经存在于 map 中,检查它是否映射到字符 tChar。如果不是,则说明存在不同的映射关系,返回 "NO"。
  • 否则,将 sChar 和 tChar 添加到 map 中。

在添加映射关系之前,还需要检查字符 tChar 是否已经被映射过。如果是,则说明存在不同字符映射到同一个字符上的情况,返回 "NO"。

如果以上步骤都通过了,说明两种分类方式是同构的,返回 "YES"。

最终返回值是一个字符串,表示两种分类方式是否同构。

该算法的时间复杂度为O(n),其中n为字符串的长度。