时间:2020-8-30
题目地址:https://leetcode-cn.com/problems/isomorphic-strings/
题目难度:Easy
题目描述:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = "egg", t = "add"
输出: true
示例 2:
输入: s = "foo", t = "bar"
输出: false
示例 3:
输入: s = "paper", t = "title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
思路1:暴力
第一次提交忽略了顺序,有一个用例没有通过,"abba" "abab"
代码段1:通过
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
length, dict_s, dict_t = len(s), {}, {}
for i in range(length):
if s[i] in dict_s:
dict_s[s[i]] += 1
else:
dict_s[s[i]] = 1
if t[i] in dict_t:
dict_t[t[i]] += 1
else:
dict_t[t[i]] = 1
if list(dict_s.values()) != list(dict_t.values()):
return False
return True
总结:
- 自从心理咨询考试结束之后就一直在简单题里刷自信,哈哈哈哈哈
思路2:大佬们的优化写法,简直厉害了
- str 类型数据拥有内置函数 index,输入一个子字符串,可以返回子字符串在 str 中第一次出现的索引,若不存在则报错
- map(函数,可迭代对象) 将会对(参数2:可迭代对象)中的每个元素运用(参数1:函数)并将结果按顺序储存在一个迭代器中,返回这个迭代器
- 使用 [*……] 可对对象解包,本题中 [*map……] 等效于 list(map……)
代码段2:通过
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
return [*map(s.index, s)] == [*map(t.index, t)]
总结:
- 得把数据结构掌握好了,才能达到这程度吧
思路3:大佬们的优化写法,简直厉害了
这个很厉害,就用了一个字典,其实代码写完自己可以检查,能优化的其实很多
代码段3:通过
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if not s:
return True
dic={}
for i in range(len(s)):
if s[i] not in dic:
if t[i] in dic.values():
return False
else:
dic[s[i]]=t[i]
else:
if dic[s[i]]!=t[i]:
return False
return True
总结:
- 持续学习,不断输出