同构字符串

今天在力扣上看到一道题,判断两个字符串是否为同构字符串,题目如下:

给定两个字符串 s 和 t,判断它们是否是同构的。

如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

示例 1:

输入: s = "egg", t = "add"
输出: true

示例 2:

输入: s = "foo", t = "bar"
输出: false

示例 3:

输入: s = "paper", t = "title"
输出: true

说明:
你可以假设 s 和 t 具有相同的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/isomorphic-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

开始一直理解为字符可以映射自己本身和两个字符不能映射同一字符不冲突,也就是我一直觉得假设a映射a,如果后续出现b映射a,那么也是成立的。

然而,连错两次之后,调整了一下代码,如果前面有a映射了自己,后续再出现其他字符映射a则判断为非同构字符串,试了一下,通过了... ...

这可能就是语文没学好吧... ...

思路比较简单就是有点费内存:

保存映射,然后校验得出结果。

class Solution {
    public boolean isIsomorphic(String s, String t) {
        Map<Character, Character> map = new HashMap<>();
        char[] sarr = s.toCharArray();
        char[] tarr = t.toCharArray();
        boolean res = true;
        for (int i = 0; i < sarr.length; i++) {
            if (map.containsKey(sarr[i])) {
                if (map.get(sarr[i]) == tarr[i]) {
                    continue;
                }
                res = false;
                break;
            } else if (map.containsValue(tarr[i])) {
                res = false;
                break;
            } else {
                map.put(sarr[i], tarr[i]);
            }
        }
        return res;
    }
}

还有另一种思路但是没实践过:

假设字符串s为标准去校验字符串t,先将两个字符串转为数组,遍历字符数组s,获取到与当前元素同位的字符数组t中的元素,然后从头开始遍历字符数组t,如果没有发现该元素,那么进行字符数组s的第二次遍历。

反之,如果发现与该元素相同的元素,则获取相同元素的下标,找到字符数组s中该下标上的元素,与当前遍历到的字符数组s中的元素相对比,两者相同则continue,否则说明两个字符串不是同构字符串。

这种思路应该是可以成立的,虽然我没试过。好处就是不需要保存映射了,坏处就是可能运算的时间会更长(感觉这样遍历的话,应该比使用Map中的contains方法来的慢,仅为猜测没测试过)。

原文地址:https://www.cnblogs.com/wxdmw/p/14047403.html