给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s ="egg"
, t ="add"
输出:true
示例 2:
输入:s ="foo"
, t ="bar"
输出:false
示例 3:
输入:s ="paper"
, t ="title"
输出:true
解题思路
映射
在题目中提到了一个知识——映射,我们在这里讲一下映射的概念
映射::从一个集合射到另一个集合,把集合1的元素1射到集合的元素A,强调2个集合中元素之间的对应关系
单射::指将不同的变量映射到不同的值的函数
满射::Y集合中的每一个y,都有X集合中的一个x与之对应。满足满射的映射可以不满足单射,
双射:即满足单射又满足满射的映射称为双射。
哈希表
哈希表是一种用于存储键值对的数据结构,它通过使用一个哈希函数,能够实现快速查找、插入、删除的操作。
初始化::HashMap<数据类型,数据类型> hash=new HashMap<>(); hash是我在这里设置的HashMap的名称
判断哈西部是否为空:hash.isEmpty();
添加新值:hash.put<key,value>;
判断哈希表中是否包含某个key值:hash.containsKey(key);
检查 hashMap 中是否存在指定的 value 对应的映射关系:hash.containsValues(value);
获取某个key值所对应的value值: hash.put(key);
清除某个key及其对应的value :hansh.remove(key);
清除所有的键值对:hash.clear();
该题解法:
刚开始时由于我已经忘了java的很多知识导致我看到该题一点思路都没有,还是要多多刷题呀
在该题中要求每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身,说明是一个双射的问题,即一一对应的关系,所以我们可以使用HashMap来解决(因为HashMap中含有键值对,是一一对应的)我们可以创建两个HashMap——s2t(用来表示s-t的对应) t2s(用来表示t-s的对应),然后遍历字符串 若此时s2t包含s中的当前字符并且其对应的value值和t中对应值不等或者t2s包含t中的当前字符并且其对应的value值和s中对应值不等,则返回false;否则将当前的值分别加入到对应的哈希表中
HashMap<Character,Character> s2t=new HashMap<>();
HashMap<Character,Character> t2s=new HashMap<>();
if(s.length(0!=t.length()) //若链各个字符串的长度不相等的时候,直接返回false;
return false;
for(int i=0;i<s.length();i++)
{
char ss=s.charAt(i); //先获取对应的值
char tt=t.charAt(i);
if((s2t.containsKey(ss) && (s2t.get(ss)!=tt)) ||(t2s.containsKey(tt) && (t2s.get(tt)!= ss))) //进行判断
return false;
s2t.put(ss,tt);
t2s.put(tt,ss);
}
return true;