同构字符串(简单的方法?)

时间:2018-08-09 07:05:53

标签: python

因此,我一直在尝试解决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))

现在,我了解到这可能是您一整天都看到的最愚蠢的代码,但这是我的观点。我想知道为什么这是错误的(以及在哪里),以及我应该如何进一步发展。

5 个答案:

答案 0 :(得分:1)

您可以使用两个字典来跟踪ab中每个字符的映射以及ba中每个字符的映射遍历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]