O(n)解决方案中的Python语法检查

O(n)解决方案中的Python语法检查,python,Python,我正在检查两个字符串是否是字谜。这个解决方案很简单,但效率不高(Ologn)。我知道我可以使用集合和计数器,然后比较每个字符的出现情况,但我试图避免任何面试模块。解决这个问题最快的方法是什么?(也许,检查每个字符的出现情况?) 您的代码甚至没有返回正确的值。这一班轮是O(n对数n): 对于O(n)解决方案,可以计算所有字符: from collections import Counter # ... def check(a, b) return Counter(a) == Counter(b

我正在检查两个字符串是否是字谜。这个解决方案很简单,但效率不高(Ologn)。我知道我可以使用集合和计数器,然后比较每个字符的出现情况,但我试图避免任何面试模块。解决这个问题最快的方法是什么?(也许,检查每个字符的出现情况?)


您的代码甚至没有返回正确的值。这一班轮是O(n对数n):

对于O(n)解决方案,可以计算所有字符:

from collections import Counter
# ...
def check(a, b)
  return Counter(a) == Counter(b)
如果没有收藏,它会更长:

def check(a, b):
    chars = dict.fromkeys(a + b, 0)
    for c in a:
        chars[c] += 1
    for c in b:
        chars[c] -= 1
    return not any(chars.values())
此代码执行以下操作:

  • chars=dict.fromkeys(a+b,0)
    :创建一个dict,将任一单词中出现的所有字符设置为0
  • 对于a中的c:chars[c]+=1
    :这将在
    a
    上迭代并计算其中每个字符的出现次数
    chars
    现在包含单独字符的计数(对于b中的字符,有些是零,而不是a中的字符)
  • 对于b中的c:chars[c]=1
    :与之前大致相同,但这将从
    字符中减去
    b
    的字符计数
  • 不返回任何(chars.values())
    chars['h']==0
    当且仅当
    a
    b
    具有相同数量的
    'h'
    。此行检查
    chars
    是否只有零作为值,这意味着所有字符在两个输入中的计数相同。(如
    any
    如果序列中有任何真值,则返回。0为假值,其他整数为真值。)
两个列表都被迭代一次。假设字典的访问时间为O(1),则整个算法在O(n)时间内运行(其中n是输入的总长度)。空间复杂度也是O(n)(所有字符都可以是不同的)。当他们问你复杂性时,不要犯那个错误。这不是必要的时间复杂性。

这里有一个很好的选项:

def anagram解决方案(s1、s2):
表_尺寸=128
c1=[0]*表格大小
c2=[0]*表格大小
对于s1中的ch:
pos=作战需求文件(ch)
c1[pos]=c1[pos]+1
对于s2中的ch:
pos=作战需求文件(ch)
c2[pos]=c2[pos]+1
j=0
stillOK=True

而j我会这样写,没有导入:

def count_occurences(mystring):
    occs = {}
    for char in mystring:
        if char in occs:
            occs[char] += 1
        else:
            occs[char] = 1
    return occs

def is_anagram(str1, str2):
    return count_occurences(str1) == count_occurences(str2)
或者,如果您可以使用导入,而不是
计数器
,请使用
defaultdict

from collections import defaultdict

def count_occurences(mystring):
    occs = defaultdict(int)
    for char in mystring:
        occs[char] += 1

    return occs

def is_anagram(str1, str2):
    return count_occurences(str1) == count_occurences(str2)

快速甚至不是这里的问题。您的代码中有多个错误,使它认为“car”和“cat”是字谜。
如果排序(l1)==sorted(l2)
是,取决于排序的方式,可能是
O(nlogn)
@user2357112 O dam true。它为什么要这样做。对不起,我是新来的。@r你能解释一下“离开”是什么意思吗。O(nlogn)比O(n)快吗?您将在第一次迭代时返回。另外,您应该使用
zip
,而不是嵌套的
for
loopfrom collections import CounterYe my bad。不过我不想用收藏品,我想面试官不会喜欢的。第一种解决方案不是最快的,对吗?@Angular:python内部使用O(n logn)算法进行排序,所以是的,第一种算法的速度逐渐变慢了。@Angular我不认识所有的面试官,但如果我是面试官,我希望人们知道他们正在使用的平台。编写好的算法是一项重要的技能。了解您使用的平台的优势是另一个问题。您可以通过初始化
chars=dict.fromkeys(a+b,0)
来简化。我认为这个答案很有价值,因为它是一个不需要导入作业的解决方案。但是,不需要保持循环一次
stillOK
False
。此时,您只需返回
False
。当stillOk设置为False时,循环将终止。请参见
,jso ord是一个内置函数,它返回ASCII字符或每个字母或其他内容,这是正确的。这提出了一个很好的观点,假设字符串是小写的。如果它们是大写的,它将不会像预期的那样工作。您可以将数组的大小增加一倍,以容纳大写字母,从每个字母中减去
ord('A')
。您也可以使用字典,只存储遇到的字符。最后,您将不得不在键上循环。即使是大写字母也需要修改
def anagramSolution(s1,s2):

    TABLE_SIZE = 128
    c1 = [0]*TABLE_SIZE
    c2 = [0]*TABLE_SIZE

    for ch in s1:
        pos = ord(ch)
        c1[pos] = c1[pos] + 1

    for ch in s2:
        pos = ord(ch)
        c2[pos] = c2[pos] + 1

    j = 0
    stillOK = True
    while j<TABLE_SIZE and stillOK:
        if c1[j]==c2[j]:
            j = j + 1
        else:
            stillOK = False

    return stillOK
def count_occurences(mystring):
    occs = {}
    for char in mystring:
        if char in occs:
            occs[char] += 1
        else:
            occs[char] = 1
    return occs

def is_anagram(str1, str2):
    return count_occurences(str1) == count_occurences(str2)
from collections import defaultdict

def count_occurences(mystring):
    occs = defaultdict(int)
    for char in mystring:
        occs[char] += 1

    return occs

def is_anagram(str1, str2):
    return count_occurences(str1) == count_occurences(str2)