LeetCode同构字符串函数始终返回True问题排查求助
排查同构字符串函数的问题
我正在LeetCode上解决**同构字符串(Isomorphic Strings)**问题,当前实现的函数始终返回true,无法得到预期结果。我希望先自行梳理思路解决问题,暂不参考最优解。以下是我的代码,请帮忙排查问题:
var isIsomorphic = function(s, t) { const map = new Map(); const array1 = [...s]; const array2 = [...t]; for (i = 0; i < s.length; i++) { if ((map.has(array1[i]) === true) && (map.has(array2[i]) === true)) { if (map.get(array1[i]) !== array2[i]) { return false; } else { continue; } } else if (map.has(array1[i]) === false) { map.set(array1[i], array2[i]); } } return true; };
问题分析
你的代码存在几个关键问题,导致结果始终不符合预期:
- 缺失反向映射校验:同构要求字符串的字符是双向唯一对应,你只维护了
s到t的单向映射,没有限制多个s字符不能映射到同一个t字符。比如输入s="ab"、t="aa"时,代码会把a→a、b→a都存入映射,最终错误返回true。 - 条件判断逻辑无效:
map.has(array2[i])这个判断完全没用,因为你的map的key都是s的字符,array2[i]是t的字符,永远不会被map.has()命中,等于这个条件分支从未执行过。 - 循环变量未声明:
for循环里的i没有用let/const声明,会变成全局变量,虽不影响功能,但不符合代码规范。
修复思路(基于原逻辑调整,不使用最优解)
要保证双向映射的唯一性,可以维护两个Map分别记录s→t和t→s的对应关系,在添加映射前做双向校验。以下是修复后的代码:
var isIsomorphic = function(s, t) { const sToT = new Map(); const tToS = new Map(); for (let i = 0; i < s.length; i++) { const sChar = s[i]; const tChar = t[i]; // 检查s字符已有映射是否匹配当前t字符 if (sToT.has(sChar)) { if (sToT.get(sChar) !== tChar) { return false; } } else { // 检查t字符是否已被其他s字符占用 if (tToS.has(tChar)) { return false; } // 同时添加双向映射 sToT.set(sChar, tChar); tToS.set(tChar, sChar); } } return true; };
内容的提问来源于stack exchange,提问作者Vagabond
相关产品推荐
相关产品推荐

