205. 同构字符串
给定两个字符串 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 字符组成
参考答案(哈希表)
O(n*)算法,这里直接使用的是Java里面的HashMap进行哈希表映射,但是这算法还不是最优的。
class Solution {
public boolean isIsomorphic(String s, String t) {
// 检查两个字符串的长度是否相同,如果不同则直接返回false
if (s.length() != t.length()) {
return false;
}
// 使用两个Map来分别映射s和t中的字符到它们对应的字符
Map<Character, Character> sToT = new HashMap<>();
Map<Character, Character> tToS = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
char c1 = s.charAt(i);
char c2 = t.charAt(i);
// 如果s中的字符c1已经映射到了另一个字符,或者t中的字符c2已经映射到了另一个字符
if (sToT.containsKey(c1) && sToT.get(c1) != c2 ||
tToS.containsKey(c2) && tToS.get(c2) != c1) {
return false;
}
// 建立映射关系
sToT.put(c1, c2);
tToS.put(c2, c1);
}
// 如果所有字符都正确映射,返回true
return true;
}
}
执行耗时:
参考答案(哈希关联容器)
class Solution {
public:
bool isIsomorphic(string s, string t) {
unordered_map<int,int> st;
int n=s.size(),m=t.size(),d=m/n;
for(int i=0;i<n;i++){
int a=s[i],b=d>1?stoi(t.substr(i*d+2,3)):t[i];//截取unicode码的后三位代替ascii码
if(st[a+128]!=st[b])return false;
st[a+128]=st[b]=i+1;
}
return true;
}
};
什么鬼东西这么抽象