题目来源:LeetCode205:同构字符串
问题抽象: 给定两个字符串 s 和 t,要求判断它们是否 同构(即字符映射关系保持一致),需满足以下核心需求:
-
同构定义:
- 双射映射:存在字符映射
f使得s中每个字符替换为f(c)后等于t,且满足:s的 相同字符 必须映射到t的 相同字符;s的 不同字符 必须映射到t的 不同字符(避免多对一冲突)。
- 双射映射:存在字符映射
-
输入约束:
- 字符串长度
∈ [1, 5*10^4](s和t长度 必须相等); - 字符范围 任意 ASCII 字符(含字母、数字、符号等);
- 需高效处理长字符串(禁止
O(n²)算法)。
- 字符串长度
-
映射验证规则:
- 双向一致性:需同时验证
s→t和t→s的映射唯一性(避免s="ab",t="aa"类冲突); - 位置同步:对所有索引
i,若s[i] = s[j]则t[i] = t[j],反之亦然。
- 双向一致性:需同时验证
-
边界处理:
- 单字符:
s="a",t="b"→true(合法映射); - 重复字符:
s="aa",t="bb"→true;s="aa",t="bc"→false(映射不一致); - 多对一冲突:
s="ab",t="aa"→false('a'和'b'均映射到'a'); - 示例:
s="egg",t="add"→true(e→a,g→d);s="foo",t="bar"→false(o映射到a和r)。
- 单字符:
-
计算要求:
- 时间复杂度 O(n)(单次遍历);
- 空间复杂度 O(1)(固定大小 ASCII 映射表
[256])。
输入:字符串 s 和 t(如 "paper", "title")
输出:布尔值(true 表示同构,false 表示不同构)。
解题思路
要判断两个字符串是否同构,需满足以下条件:
s中的每个字符必须映射到t中的唯一字符。- 不同字符不能映射到同一个字符(确保单射)。
- 相同字符只能映射到同一个字符(确保一致性)。
- 字符顺序保持不变。
算法步骤:
- 初始化映射和标记数组:
- 使用长度为 256 的整数数组
map记录s中字符到t中字符的映射(初始化为 -1)。 - 使用长度为 256 的布尔数组
used标记t中字符是否已被映射(初始化为false)。
- 使用长度为 256 的整数数组
- 遍历字符串:
- 对于每个位置
i,取出字符c1 = s.charAt(i)和c2 = t.charAt(i)。 - 检查映射:
- 若
c1已建立映射,检查其映射值是否等于c2,不等则返回false。 - 若
c1未建立映射,检查c2是否已被其他字符映射(通过used数组),若已被使用则返回false。
- 若
- 建立映射:
- 若
c1未映射且c2未使用,建立c1到c2的映射,并标记c2为已使用。
- 若
- 对于每个位置
- 完成遍历:
若遍历结束未发现冲突,返回true。
代码实现(Java版)🔥点击下载源码
class Solution {
public boolean isIsomorphic(String s, String t) {
int n = s.length();
// 映射数组:s 中的字符映射到 t 中的字符,初始化为 -1
int[] map = new int[256];
// 标记数组:记录 t 中的字符是否已被映射
boolean[] used = new boolean[256];
// 初始化映射数组为 -1
Arrays.fill(map, -1);
for (int i = 0; i < n; i++) {
char c1 = s.charAt(i);
char c2 = t.charAt(i);
// 若 c1 已有映射,检查是否匹配当前 c2
if (map[c1] != -1) {
if (map[c1] != c2) {
return false;
}
} else {
// 若 c1 无映射,但 c2 已被其他字符映射,冲突
if (used[c2]) {
return false;
}
// 建立 c1 -> c2 的映射,并标记 c2 为已使用
map[c1] = c2;
used[c2] = true;
}
}
return true;
}
}
代码说明
- 映射数组
map:
下标为s中字符的 ASCII 值,存储对应的t中字符的 ASCII 值。初始化-1表示未建立映射。 - 标记数组
used:
下标为t中字符的 ASCII 值,true表示该字符已被s中某个字符映射。 - 遍历逻辑:
- 已建立映射时检查一致性(
map[c1] != c2则失败)。 - 未建立映射时检查
t中字符是否已被占用(used[c2] == true则失败)。 - 通过则建立新映射并标记。
- 已建立映射时检查一致性(
- 边界处理:
题目保证字符串非空,无需额外检查。
提交详情(执行用时、内存消耗)

163

被折叠的 条评论
为什么被折叠?



