题目
给定两个字符串
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 * 104
t.length == s.length
s
和t
由任意有效的 ASCII 字符组成
题目解析
同构字符串意思就是字符串1中的每个字符都唯一映射字符串b中的一个字符
比如 a---->d,c----->e,这个对应关系是双向的,即1中字符a--->b,b
思路
可以使用一个map来存储对应关系,键为字符串1的当前字符,值为字符串2的当前字符
如果遇到map中已经有了该key,那么就需要取出来value,判断value是否与字符串2的当前值一样,一样说明是对应的,不一样说明不对应,直接返回false
例如 abb ,cdf ,
但是这种情况忽略了一种情况
badc,babe,因为b已经对应了b,那么d就不能再对应b
代码
public static boolean canConstruct1(String ransomNote, String magazine) {
//存储当前字符出现次数
int[] nums=new int[26];
//看magazine中每个字符出现次数
for(char a:magazine.toCharArray()){
nums[a-'a']++;
}
//遍历ransomNote
for(char b :ransomNote.toCharArray()){
//次数先-1
nums[b-'a']--;
//次数小于0,说明magazine中字符少,直接返回false
if(nums[b-'a']<0){
return false;
}
}
return true;
}