因此,我一直在尝试解决Leetcode上的Easy问题,到目前为止,我还不了解我在互联网上找到的大多数答案。我尝试解决同构字符串问题(此处:https://leetcode.com/problems/isomorphic-strings/description/) 我想出了以下代码
def isIso(a,b):
if(len(a) != len(b)):
return false
x=[a.count(char1) for char1 in a]
y=[b.count(char1) for char1 in b]
return x==y
string1 = input("Input string1..")
string2 = input("Input string2..")
print(isIso(string1,string2))
现在,我了解到这可能是您一整天都看到的最愚蠢的代码,但这是我的观点。我想知道为什么这是错误的(以及在哪里),以及我应该如何进一步发展。
答案 0 :(得分:1)
您可以使用两个字典来跟踪a
到b
中每个字符的映射以及b
到a
中每个字符的映射遍历a
,如果相应字符中有任何违规,则返回False
;否则最后返回True
。
def isIso(a, b):
m = {} # mapping of each character in a to b
r = {} # mapping of each character in b to a
for i, c in enumerate(a):
if c in m:
if b[i] != m[c]:
return False
else:
m[c] = b[i]
if b[i] in r:
if c != r[b[i]]:
return False
else:
r[b[i]] = c
return True
因此:
print(isIso('egg', 'add'))
print(isIso('foo', 'bar'))
print(isIso('paper', 'title'))
print(isIso('paper', 'tttle')) # to test reverse mapping
将输出:
True
False
True
False
答案 1 :(得分:1)
我尝试创建一个字典,结果是 72 毫秒的运行时间。 这是我的代码 -
def isIsomorphic(s: str, t: str) -> bool:
my_dict = {}
if len(s) != len(t):
return False
else:
for i in range(len(s)):
if s[i] in my_dict.keys():
if my_dict[s[i]] == t[i]:
pass
else:
return False
else:
if t[i] in my_dict.values():
return False
else:
my_dict[s[i]] = t[i]
return True
答案 2 :(得分:0)
如果我正确地理解了问题,因为一个字符可以映射到自身,这只是看两个单词的字符数是否相同的一种情况。
所以egg和add是同构的,因为它们的字符数为(1,2)。同样,论文和标题的计数为(1,1,1,2)。
foo和bar不是同构的,因为计数分别是(1,2)和(1,1,1)。
要查看字符数是否相同,我们需要对它们进行排序。
所以:
from collections import Counter
def is_isomorphic(a,b):
a_counts = list(Counter(a).values())
a_counts.sort()
b_counts = list(Counter(b).values())
b_counts.sort()
if a_counts == b_counts:
return True
return False
您的代码失败,因为这里:
x=[a.count(char1) for char1 in a]
您可以为字符串中的每个字符计算字符串中每个字符的出现次数。因此,像“奇数”这样的单词将不具有(1,2)的计数,当您对d进行两次计数时,它将具有(1,2,2)!
答案 3 :(得分:0)
有许多不同的方法可以做到这一点。下面,我通过使用字典,集合和string.translate提供了三种不同的方式。
Here I provided three different ways how to solve Isomorphic String solution in Python.
答案 4 :(得分:0)
from itertools import zip_longest
def isomorph(a, b):
return len(set(a)) == len(set(b)) == len(set(zip_longest(a, b)))
这是第二种方法:
def isomorph(a, b):
return [a.index(x) for x in a] == [b.index(y) for y in b]