题目描述
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
1 例如
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
2 分析:
我们可以利用一个 map 来处理映射。对于 s 到 t 的映射,我们同时遍历 s 和 t ,假设当前遇到的字母分别是 c1 和 c2;
若map[c1]存在,那么就判断 map[c1] 是否等于 c2,也就是验证之前的映射和当前的字母是否相同。
若map[c1]不存在,就将c1 映射 c2,map[c1] = c2;
3 代码:
package com.johann.leetcode;
/*
题目:同构字符串
1、例如:s="ab" t="bc"
s->t
a->b
b->c
return true;
2、例如:s="cca" t="aad"
c->a
c->a
a->d
return true;
分析:
我们可以利用一个 map 来处理映射。对于 s 到 t 的映射,我们同时遍历 s 和 t ,假设当前遇到的字母分别是 c1 和 c2;
若map[c1]存在,那么就判断 map[c1] 是否等于 c2,也就是验证之前的映射和当前的字母是否相同。
若map[c1]不存在,就将c1 映射 c2,map[c1] = c2;
*/
import java.util.HashMap;
import java.util.Map;
public class T205_IsomorphicString {
//单向的s->t
private static boolean isomorphic(String s, String t){
//事先排除两字符串不相等的情况 和 排除""这种特殊情况
if (s.length() != t.length() || t.isEmpty()) {
System.out.println("输入不合法或字符串长度不一致");
return false;
}
//定义一个map映射,存储字符char
Map<Character,Character> map =new HashMap<>();
//拿到长度
int n = s.length();
//循环遍历s
for (int i = 0; i < n; i++) {
char c1 = s.charAt(i);
char c2 = t.charAt(i);
if (map.containsKey(c1)) {
if (map.get(c1) != c2) {
return false;
}
}else {
map.put(c1,c2);
}
}
return true;
}
//再递归调用一次,变成双向,即s->t t->s
private static boolean bidirectionalIsomorphic(String s,String t){
return isomorphic(s,t) && isomorphic(t,s);
}
public static void main(String[] args) {
String s1="";
String t1="ab";
//System.out.println(isomorphic(s1,t1)); //单向是true
System.out.println(bidirectionalIsomorphic(s1,t1)); //双向是false
}
}
4 链接:
https://gitee.com/johannting/learnjava.git
![](https://img-blog.csdnimg.cn/0b763128f2d34976aad298f46b7b14ba.jpg)