O(n)解决方案中的Python语法检查
我正在检查两个字符串是否是字谜。这个解决方案很简单,但效率不高(Ologn)。我知道我可以使用集合和计数器,然后比较每个字符的出现情况,但我试图避免任何面试模块。解决这个问题最快的方法是什么?(也许,检查每个字符的出现情况?)O(n)解决方案中的Python语法检查,python,Python,我正在检查两个字符串是否是字谜。这个解决方案很简单,但效率不高(Ologn)。我知道我可以使用集合和计数器,然后比较每个字符的出现情况,但我试图避免任何面试模块。解决这个问题最快的方法是什么?(也许,检查每个字符的出现情况?) 您的代码甚至没有返回正确的值。这一班轮是O(n对数n): 对于O(n)解决方案,可以计算所有字符: from collections import Counter # ... def check(a, b) return Counter(a) == Counter(b
您的代码甚至没有返回正确的值。这一班轮是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())
此代码执行以下操作:
:创建一个dict,将任一单词中出现的所有字符设置为0chars=dict.fromkeys(a+b,0)
:这将在对于a中的c:chars[c]+=1
上迭代并计算其中每个字符的出现次数a
现在包含单独字符的计数(对于b中的字符,有些是零,而不是a中的字符)chars
:与之前大致相同,但这将从对于b中的c:chars[c]=1
字符中减去
的字符计数b
:不返回任何(chars.values())
当且仅当chars['h']==0
和a
具有相同数量的b
。此行检查'h'
是否只有零作为值,这意味着所有字符在两个输入中的计数相同。(如chars
如果序列中有任何真值,则返回。0为假值,其他整数为真值。)any
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)