def isPerm(s1, s2):
if len(s1) != len(s2):
return False
a = dict()
for char in s1:
a[char] = True
for char2 in s2:
if a.get(char2) == True:
continue
else: return False
return True
这是我写的一个函数,用于查找两个字符串是否相互排列。 但是当我通过它推理时,我不确定为什么这会起作用(我得到了正确的输出)。根据我的知识,dict就像一个哈希表。
例如,如果我有s1和s2为“ab”和“aab”,这应该给我False,这个功能就是这样。现在,在第一个for循环中,当我转到s1中的每个char时,我有一个dict,其中“a”和“b”映射为True。
当我转到第二个for循环时,我检查“a”的dict值并且它是True,所以我继续。在第二个字符中,我再次得到一个“a”,这是真的,在第三个迭代中,“b”也给了我真实。所以,该函数应该给我True,但它给了我假。我很困惑为什么它有效!
答案 0 :(得分:1)
你的程序有效,因为它返回False
,因为在函数中检查了第一个条件。
if len(s1) != len(s2):
return False
由于ab
和aab
的大小不同,因此会立即失败。
但是,作为inspectorG4dget points out,您的计划将因输入aab
和abb
而失败。
要实际找出一个字符串是否是另一个字符串的排列,您应该计算每个字符在两个字符串中出现的次数,如果所有计数都相等,则返回True
。这可以在collections.Counter
的帮助下在Python中完成,就像这样
from collections import Counter
def isPerm(s1, s2):
return Counter(s1) == Counter(s2)
collections.Counter
为您提供字符及其相应计数的字典。例如,
>>> from collections import Counter
>>> Counter("aab")
Counter({'a': 2, 'b': 1})
>>> Counter("abb")
Counter({'b': 2, 'a': 1})
>>> Counter("aab") == Counter("abb")
False
>>> Counter("aab") == Counter("aba")
True
使用普通词典的另一种方法,
def counter(s):
d = {}
for char in s:
d[char] = d.get(char, 0) + 1
return d
def isPerm(s1, s2):
return counter(s1) == counter(s2)
assert isPerm("aab", "aba") == True
assert isPerm("aab", "abb") == False
答案 1 :(得分:1)
检查排列的代码解决方案更加简单。它也是O(nlogn)
复杂性。只需对字符串进行排序并比较结果。
def isPerm(s1, s2):
return sorted(s1) == sorted(s2)