题目
Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
Example 1:
Input: s = "egg", t = "add"
Output: true
Example 2:
Input: s = "foo", t = "bar"
Output: false
Example 3:
Input: s = "paper", t = "title"
Output: true
Note:
You may assume both s and t have the same length.
总结
这道题稍微有点绕,提交了5次才AC。仔细审题很重要…题目要求可以精简为:
给一个字符串s,一个字符串t。
1,任何s中个不同的字符不能映射到t中相同的字符
2,任何s中相同的字符必须映射到t中相同的字符
(反过来一样,任意t中不同的字符不能映射到s中相同的字符,任何t中相同的字符必须映射到s中相同的字符)
思路一: 用map保存映射关系,同时用一个set(hash)保存之前s已经映射过的值。map用于验证第2点,set用于验证第1点
代码:
class Solution:
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
maped = set()
dict = {}
for i in range(len(s)):
if s[i] in dict:
if t[i] != dict[s[i]]:
return False
else:
if t[i] in maped:
return False
dict[s[i]] = t[i]
maped.add(t[i])
return True
思路二:
ASCII一共有256个,可以用两个256的数组来记录映射关系。对于每对映射,分别把对应数组对应位置设置为一个相同的数(每次设置的数不能和之前重复),这样,每当要添加一对新的映射时,只要数组中对应位置的值不相同,说明新的映射不符合上述要求1,2中的某一点。(可以设想,如果所有的数据都符合1,2点,那么每次加入新的映射,之前的值都必然相同)
解释的不是很好,看代码理解吧
class Solution:
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
m1 = [-1] * 256
m2 = [-1] * 256
for i in range(len(s)):
if m1[ord(s[i])] != m2[ord(t[i])]:
return False
m1[ord(s[i])] = i
m2[ord(t[i])] = i
return True
上面的代码其实不是很好,因为当字符串远小于256的时候会浪费很多空间,可以考虑用map代替数组