擅长:python、mysql、java
<p>我重写了代码,没有一些复杂性(和错误)。在</p>
<pre><code>def test_o_o(a, b):
L = len(a)
H = L//2
n, m = 0, H-1
# find the first difference in the left-side
while n < H:
if a[n] != b[n]: break
n += 1
else: return
# find the last difference in the left-side
while m > -1:
if a[m] != b[m]: break
m -= 1
else: return
# for slicing, we want end_index+1
m += 1
# compare each slice for equality
# order: beginning, block 1, block 2, middle, end
if (a[0:n] == b[0:n] and \
a[n:m] == b[L-m:L-n] and \
b[n:m] == a[L-m:L-n] and \
a[m:L-m] == b[m:L-m] and \
a[L-n:L] == b[L-n:L]):
return n, m
</code></pre>
<p>实现既优雅又高效。在</p>
<p><code>break</code>into<code>else: return</code>结构确保函数在最快的时间点返回。它们还验证<code>n</code>和{<cd4>}是否已设置为有效值,但在显式检查切片时似乎没有必要这样做。这些管路可以拆下而不会对正时产生明显影响。在</p>
<p>显式地比较切片也会在计算结果为<code>False</code>时短路。在</p>
<p>最初,我通过将<code>b</code>转换为<code>a</code>来检查是否存在置换:</p>
^{pr2}$
<p>但这比显式比较切片慢。让我知道,如果算法不能说明自己,我可以提供进一步的解释(甚至可以证明)为什么它工作,它是最小的。在</p>