同构字符串

题目

难度级别:简单

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

说明:

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

解题思路

法一

通过固定遍历字符串末项,且设置一个指针,倒序遍历,若发现s与t字符串同时与prev项相等,则重新拼接字符串,去掉prev项。若其中一个与prev相等则返回false。遍历完之后删除末项。

const isIsomorphic = function(s, t) {
    while(s.length) {
        let prev = s.length - 2

        while(prev >= 0) {
            if (s[s.length - 1] === s[prev] && t[t.length - 1] === t[prev]){
                s = s.slice(0, prev) + s.slice(prev + 1)
                t = t.slice(0, prev) + t.slice(prev + 1)
            }else if (s[s.length - 1] === s[prev] || t[t.length - 1] === t[prev]) {
                return false
            }
            --prev
        }
        s = s.slice(0, s.length - 1)
        t = t.slice(0, t.length - 1)
    }

    return true
};

哈希表

遍历字符串,2张哈希表分别存储s与t,若值不存在,存储值为索引,若值存在判断是否相等。

const isIsomorphic = function(s, t) {
    const hashMapS = new Map()
    const hashMapT = new Map()

    for (let i = 0; i < s.length; i++) {
        const hasS = hashMapS.has(s[i])
        const hasT = hashMapT.has(t[i])

        if (!hasS && !hasT) {
            hashMapS.set(s[i], i)
            hashMapT.set(t[i], i)
        }else if(!hasS || !hasT || hashMapS.get(s[i]) !== hashMapT.get(t[i])) {
             return false
        }
    }

    return true
};

字符串indexOf

通过字符串indexOf方法查找与当前项值相等的第一项。若s与t返回的索引不相等,则返回false。

const isIsomorphic = function(s, t) {
    for (let i = 0; i < s.length; i++) {
        if(s.indexOf(s[i]) !== t.indexOf(t[i])) return false
    }
    return true
};

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/isomorphic-strings

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