给定两个字符串 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 字符组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
方法一
思路分析
t.length == s.length 所以无需考虑长度
相同的字符用find找到的index一定是一样的
利用这点我们可以利用find来验证是否pattern相同
- 假设有foo和baa,当我们到最后一个index时s里找'o'和t里找'a'一定会返回
- 相同的index,因为之前已经出现过了,这里s里的'o'跟t里的'a'都会返回index 1
- 再假设我们有foo和bar,'fo'和'ba'是没有问题的,但是当我们到最后一个index时
- s里的'o'会返回1,因为之前已经出现过,而t里的'r'会返回2,因为之前并没有
- 出现过这个字母,这样就可以验证他们的pattern是否相同
bool isIsomorphic(string s, string t) { for (int i = 0; i < s.size(); ++i) { if (s.find(s[i]) != t.find(t[i])) { return false } } return true; }
方法二
思路分析
为具有对应关系的字符连边并赋予权值,初始值为 0 表示未有映射关系,同为 0 才能连边
因此如果是同构字符串,每对字符的值应该相等
bool isIsomorphic(string s, string t) { int sm[128] = {0}; int tm[128] = {0}; for (int i = 0; i < s.size(); i++) { if (sm[s[i]] != tm[t[i]]) { return false; } sm[s[i]] = tm[t[i]] = i + 1; } return true; }