"Dream big and dare to fail." - Norman Vaughan
1. 题目描述
2. 题目分析与解析
2.1 思路一
看见这个题目的第一反应就是使用一个hash表,用来存储映射关系,具体思路如下:
-
首先二者要是同构的长度肯定是得相同的,但是注意到提示有说明了
-
然后我们就可以用一个映射表,遍历s字符串的每一个字符,将它匹配到t对应的位置的字符
-
如果在遍历s字符串的某一个字符时发现这个字符在hash表中没有存在,那么就把s中的这个字符作为键,t中相应的字符作为值,放入hash表
-
如果在遍历s字符串的某一个字符时发现这个字符在hash表中存在,查看其对应的值,如果和t中对应位置的字符不相等,就说明映射失败,返回false
-
如果遍历完所有的s的字符,都没有返回false,说明满足映射,返回true。
提交后我发现出现问题了:
看见字符串我一下就想起了忘了题目中的条件:
也就是说在映射过程中即使满足映射表中不存在这个键,我们也不能将将s.charAt(i)和t.charAt(i)存入mappingMap中,因为要满足不同字符不能映射到同一个字符上。因此我们还需要加一点条件:
-
当mappingMap中不包含s.charAt(i),说明不存在该映射,这时我们应该先判断mappingMap.containsValue(t.charAt(i)),因为不同字符不能映射到同一个字符。
-
如果mappingMap.containsValue(t.charAt(i))返回true,说明不同的s字符映射到了同一个t的字符,返回false
-
如果mappingMap.containsValue(t.charAt(i))返回false,说明不同的s字符映射到了不同的t的字符,这时才可以将该映射加入映射表
3. 代码实现
3.1 思路一——哈希表
4. 相关复杂度分析
-
时间复杂度:
O(N)
,其中N
是字符串s
和t
的长度。这是因为算法需要遍历整个字符串一次,每个字符都进行一次查找、插入或比较操作。虽然对于HashMap
的查找和插入操作平均时间复杂度是O(1)
,但这里还包括了对HashMap
的containsValue
方法的调用,这个操作在最坏情况下的时间复杂度是O(k)
,其中k
是映射中的元素数量。但由于k
最大也只能是字符集的大小(假设输入字符串仅包含有限字符集),这部分的复杂度可以被认为是常数时间,因此整体时间复杂度仍然是O(N)
。 -
空间复杂度:
O(1)
,尽管使用了一个HashMap
来存储字符之间的映射关系,但由于输入字符串s
和t
都只包含有限的字符集(ASCII字符集),因此这个映射的大小会被限制在一个常数级别,不会随着输入字符串的长度N
而增长。因此,空间复杂度可以视为O(1)
。
5. 补充
ASCII(American Standard Code for Information Interchange)字符集共有128个字符。这些字符包括数字、英文字母(大写和小写)、标点符号、控制字符和一些特殊字符。ASCII字符集是计算机和通信设备中最常用的字符编码之一。