题型:字符串、哈希表
链接:205. 同构字符串 - 力扣(LeetCode)
来源:LeetCode
题目描述
给定两个字符串 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 字符组成
题目思路
这里笔者对题目要求一开始错误分析,导致第一个思路错了
错误思路:看样例,觉得创建两个unordered_map<char,int> 其中key是字母,value是出现了几次,这样的话将两个string的字符分别存入两个无序图中。看每个键值对中value值是否相等。
后来发现错误(特例很简单:【aaabbbab】和[aaabbbba])
后看题解,发现原来真的可以【映射】——具体实现思路就是将value改为另一个字符串的字母。
这样就看 这个字母有没有映射:如果有映射,但是映射不是对面的那个字符串,那么就可以false
C++代码
直接上正确代码:
class Solution {
public:bool isIsomorphic(string s, string t) {if(s.length() != t.length())return 0;// key:自己的字母 value:映射的字母unordered_map<char,char> hash1;unordered_map<char,char> hash2;for(int i=0;i<s.length();i++){char chaR1 = s[i], chaR2 = t[i];if(hash1.count(chaR1) && hash1[chaR1] != chaR2 || hash2.count(chaR2) && hash2[chaR2]!=chaR1)//count 看当前的key对应的value有没有映射。return false;hash1[chaR1]=chaR2;hash2[chaR2]=chaR1;}return 1;}
};
结算页面
顺便提一嘴:时间复杂度最少的话,貌似是 一个无序图 一个哈希集合