LeetCode205. Isomorphic Strings

173 篇文章 0 订阅

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值