例如,给定{1,1,2,2}: 这些子数组的XOR都为0:{1,1},{2,2},{1,1,2,2}。 最长的长度是4。
找到最长子数组的长度,并返回此子数组的开始和结束索引。
答案 0 :(得分:3)
计算从0个元素到所有元素的数组的运行XOR。以您的示例为例:
initial
segment XOR
[] 0
[1] 1
[1, 1] 0
[1, 1, 2] 2
[1, 1, 2, 2] 0
如果两个运行的XOR值相同,则这两个值之间的子数组将XOR到0。
创建两个映射,存储第一个和最后一个看到的XOR值。贯穿它们,找到差异最大的一对。
在Python中:
def continuous_xor(xs):
xor = 0
first_seen = {0: 0}
last_seen = {0: 0}
for i, x in enumerate(xs):
xor = xor ^ x
if xor not in first_seen:
first_seen[xor] = i+1
last_seen[xor] = i+1
return max((last_seen[i]-first_seen[i], first_seen[i], last_seen[i]) for i in last_seen)
print continuous_xor([1, 1, 2, 2])
print continuous_xor([5, 1, 4, 3, 2, 4, 6])
子数组的索引是Python样式的,开始索引是包含的,结束索引是排他的。
这以O(n)时间运行,其中n
是输入数组的大小。