[leetcode刷题]面试经典150题之7同构字符串(简单)
这个题虽然是简单题,但是看了半天还是没啥好思路,最后看了解题学到了不少知识点
1.index() 函数查找序列中首次出现的元素索引
2.zip函数:用于将可迭代的对象(如列表、元组、字典等)作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象(注意,返回的其实是一个迭代器)。
例:
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
zipped = zip(list1, list2)
# 输出:这是一个迭代器,所以直接打印看到的是它的内存地址
# 要查看其内容,可以将其转换为列表
print(list(zipped)) # 输出:[(1, 'a'), (2, 'b'), (3, 'c')]
3.字典中的一些用法
a={}
a[1]=2
print(a)
下面我会用上面的知识写两种解法
题目
同构字符串
给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
思考
两个不同的字符串,要对应他们的结构是否相同,首先能想到的就是字典是一一对应的,我们可以用字典去做。
代码1
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
# 初始化两个字典,用于分别记录 s -> t 和 t -> s 的映射关系
s_to_t = {}
t_to_s = {}
# 使用 zip 函数同时遍历 s 和 t 的字符对
for char_s, char_t in zip(s, t):
# 检查是否已经有从 s 中 char_s 到 t 中 char_t 的映射
if char_s in s_to_t:
# 如果存在映射,且映射的目标字符不是当前的 char_t,则返回 False
if s_to_t[char_s] != char_t:
return False
else:
# 如果不存在映射,则建立从 char_s 到 char_t 的映射
s_to_t[char_s] = char_t
# 同样地,检查是否已经有从 t 中 char_t 到 s 中 char_s 的映射
if char_t in t_to_s:
# 如果存在映射,且映射的目标字符不是当前的 char_s,则返回 False
if t_to_s[char_t] != char_s:
return False
else:
# 如果不存在映射,则建立从 char_t 到 char_s 的映射
t_to_s[char_t] = char_s
# 如果循环结束时没有发现不符合条件的映射关系,则返回 True,表示 s 和 t 是同构的
return True
从解题中看到一个更简单的,用index函数去做的
代码2
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
a=0
s=list(s)
t=list(t)
i=0
j=0
while i<len(s) and j<len(s):
if s.index(s[i])==t.index(t[j]):
a+=1
i+=1
j+=1
else:
return False
return a==len(s)