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
思路:这道算法题是想判断两个相同长度的字符串,在每个字符串中出现字母重复的位置是否相同.所以可以用zip()方法,讲两个字符串打包比如a='egg',b='add'------>list(zip(a,b))=[(e,a),(g,d),(g,d)],所以字母重复位置相同,list(zip())中则会出现重复元素.直接返回长度便可判断.
def isIsomorphic(self, s, t):
return len(set(zip(s, t))) == len(set(s)) == len(set(t))
其他方法(egg,add):
1# 新建两个dict,key是str中的每个字母,val是字母所在位置.最后用sorted统一.
def isIsomorphic1(self, s, t):
d1, d2 = {}, {}
for i, val in enumerate(s):
d1[val] = d1.get(val, []) + [i]
for i, val in enumerate(t):
d2[val] = d2.get(val, []) + [i]
return sorted(d1.values()) == sorted(d2.values())
2#建立两个长度为256二维数组,用ord()返回字母对应十进制整数,也就是数组的位置.(如ord('e')=101,则d1[101]=0)最后用sorted统一.因为虽然两个字符串重复位置相同,都会返回[[],[],...,[],[0],...[],...,[],[1,2],[],...[]]但字母不同,所以在数组中位置不同,需要整理.
def isIsomorphic(self, s, t):
d1, d2 = [[] for _ in range(256)], [[] for _ in range(256)]
for i, val in enumerate(s):
d1[ord(val)].append(i)
for i, val in enumerate(t):
d2[ord(val)].append(i)
return sorted(d1) == sorted(d2)
3#str.find(str1)方法,寻找在str中是否存在str1,如果存在则返回(最先出现)位置.这样两个方法返回的都是[0,1,1],因为a第一个出现在0位置,d第一个出现在1位置,检测第二个d时,还会返回字符串中第一个出现d的位置.
def isIsomorphic(self, s, t):
return [s.find(i) for i in s] == [t.find(j) for j in t]
4#与方法三相同,返回的还是[0,1,1]
def isIsomorphic(self, s, t):
return list(map(s.find, s)) == list(map(t.find, t))
5#这次建立的是一维数组,从头遍历两个字符串,比较上一次每个字符串的第i个字母出现的位置,如果第一次出现则记录位置.
def isIsomorphic(self, s, t):
d1, d2 = [0 for _ in range(256)], [0 for _ in range(256)]
for i in range(len(s)):
if d1[ord(s[i])] != d2[ord(t[i])]:
return False
d1[ord(s[i])] = i+1
d2[ord(t[i])] = i+1
return True