题目
难度级别:简单
给定两个字符串 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