嗯,昨天晚上我很無聊,所以我在Python中做了這個。它是不必要的遞歸(我只是讀了The Little Schemer,認爲遞歸現在非常整齊),但它解決了你的問題,並處理了我投擲它的所有輸入。
intervals = [(0,4), (5,13), (8,19), (10,12)]
def overlaps(x,y):
x1, x2 = x
y1, y2 = y
return (
(x1 <= y1 <= x2) or
(x1 <= y2 <= x2) or
(y1 <= x1 <= y2) or
(y1 <= x2 <= y2)
)
def find_overlaps(intervals, checklist=None, pending=None):
if not intervals:
return []
interval = intervals.pop()
if not checklist:
return find_overlaps(intervals, [interval], [interval])
check = checklist.pop()
if overlaps(interval, check):
pending = pending or []
checklist.append(check)
checklist.append(interval)
return pending + [interval] + find_overlaps(intervals, checklist)
else:
intervals.append(interval)
return find_overlaps(intervals, checklist)
使用這樣的:
>>> find_overlaps(intervals)
[(10, 12), (8, 19), (5, 13)]
注意,它返回所有重疊的間隔在其起點的順序相反。希望這是一個小問題。這只是因爲我在清單末尾使用了push()
和pop()
,而不是在開始時運行的insert(0)
和pop(0)
。
這並不完美,但它運行在線性時間。還要記住,實際字符串的大小根本不重要 - 運行時間是相對於間隔的數量而不是字符串的大小。
免費的代碼版本你所說的「字符串中重疊的間隔」是什麼意思? – 2010-07-09 03:53:07
字符串:「ThisIsATStringStringToShowWhatIMeanByIntervals」 間隔:0-4,5-13,8-19,10-12 這裏,間隔5-13,8-19和10-12重疊,所以我只能使用其中一個他們。 – efficiencyIsBliss 2010-07-09 04:00:53
間隔是否始終按起點排序? – Triptych 2010-07-09 04:04:45