一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
1.描述
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
- 1 <= s.length <= 5 * 10^4
- t.length == s.length
- s 和 t 由任意有效的 ASCII 字符组成
2.分析
- 如果映射还没有建立map[chars1[i]] == 0,就创建映射map[chars1[i]] = chars2[i]。这个时候是对于字符串1中该字符的第一次替换
- 如果映射已经建立,就判断按照映射关系替换1中的字符,是否与字符串2对应的字符相同,如果不相同map[chars1[i]] != chars2[i]说明无法按照一一替换的原则完成,直接返回false。
- 如果遍历完成,说明以字符串1可以完成替换。
3.AC代码
class Solution {
public boolean isIsomorphic(String s, String t) {
return canMap(s, t) && canMap(t, s);
}
private boolean canMap(String s, String t){
int[] map = new int[128]; // ascii 128个字符
char[] chars1 = s.toCharArray();
char[] chars2 = t.toCharArray();
for(int i = 0; i < chars1.length; i++){
if(map[chars1[i]] == 0)
map[chars1[i]] = chars2[i];
else {
if(map[chars1[i]] != chars2[i])
return false;
}
}
return true;
}
}
总结
思路还是很清晰的,就是利用哈希表建立联系,然后遍历对比即可。
参考
详细通俗的思路分析,多解法 - 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)
「代码随想录」带你学透哈希法!【205. 同构字符串】 - 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)