擅长:python、mysql、java
<p>看起来挺有趣的。这里是我使用<code>itertools.groupby</code>的解决方案</p>
<pre><code>from itertools import groupby
from collections import defaultdict
def get_idx_count(word):
"""Turns a word into a series of tuples (idx, consecutive_chars)
"aabbccaa" -> [[(0, 2), (3, 2)], [(1, 2)], [(2, 2)]]
"""
lst = defaultdict(list)
for idx, (grp, val) in enumerate(groupby(word)):
lst[grp].append((idx, sum(1 for _ in val)))
return sorted(list(lst.values()))
def is_isomorphic(a, b):
return get_idx_count(a) == get_idx_count(b)
is_isomorphic('aabbcc', 'bbddcc') # True
is_isomorphic('aabbaa', 'bbddcc') # False
</code></pre>
<p>我觉得我可以做些更像这样的事情,而不是建立清单:</p>
^{pr2}$
<p>但我还没有机会去测试。然而,它确实有可能提前退出,而不是在最后构建所有的列表并进行比较。它还跳过了一些不需要的排序,只不过我们从dicts中提取,所以bleh。很确定<code>list.sort</code>比保存到<code>collections.OrderedDict</code>快。我想。在</p>