一、题目
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
可以假设 s 和 t 长度相同。
二、方法(题解)
这道题方法最简单的无疑是哈希表,但我这里用的是数组模拟哈希表。数组模拟哈希表的优点是会快一些,但缺点是没办法解决冲突,必须有个很完美的函数转换。
我最开始看大佬题解用了i+1的转换,但在实际提交中无法通过"abbaa"、"cddcd" 这个测试用例,于是改进为i*2 还是有问题 最终改进为下面代码所用函数
所以......数组模拟哈希需谨慎!
class Solution {
public boolean isIsomorphic(String s, String t) {
int[] a = new int[256];//创建数组充当哈希表
int[] b = new int[256];
for(int i=0;i<s.length();i++){//遍历字符串
//判断数组是否相等,如果不相等说明两个字符并没有映射,此时返回false
if(a[s.charAt(i)] != b[t.charAt(i)]){
return false;
}
//相当于哈希函数
a[s.charAt(i)] = 2*i+1;
b[t.charAt(i)] = 2*i+1;
}
return true;//如果都相等说明两个字符串互为映射
}
}