我想我得到了一個O(n)
解決方案。它分幾步完成。
首先,讓我們重新思考問題。我們必須從A
中刪除一個子字符串,並從B
中刪除一個子字符串,以便剩下的內容相等。我們想從A
中移除短小的子字符串作爲possbile。請注意,您的插入操作實際上等效於B
上的相同刪除操作。
引理。如果從A
和B
中剝去相同的前綴或後綴,則不會影響最佳解決方案。留下證據,讀者:)
現在,提取A
和B
,所以A=XA*Y
,B=XB*Y
,其中X
和Y
子是最大的共同後綴,前綴。如果A*
或B*
爲空,我們得到了一個簡單的退化情況。如果不是,讓我們做一個新的記號A<-A*
,B<-B*
。
此時first(A) != first(B)
和last(A) != last(B)
。否則,我們應該已經包括在上一步中常見的符號前綴或後綴:
A = a1 A' a2
B = b1 B' b2
其中a1 = first(A)
,a2 = last(A)
,b1 = first(B)
,b2 = last(B)
和A'
和B'
是A
和B
子。這裏a1 != b1
,a2 != b2
。
要使A
和B
相等,我們必須從一個字符串中移除第一個符號,並從另一箇中移除最後一個符號。你有兩種情況。讓我們考慮只有一個,您從A
中刪除第一個符號,從B
中刪除最後一個符號。
現在您只需從A
開頭刪除儘可能少的符號,以便後綴將等於B
的某個前綴。爲此,您應該構建字符串A
的suffix tree並遍歷B
的所有前綴以檢查它們是否以後綴樹呈現。然後挑選最大的。一旦你做,你有最大的字符串C
,這是A
後綴和B
前綴:
A = PC
B = CS
從A
和S
從B
刪除P
就大功告成了。
對於原始A
和B
(沒有共同的部分移除),我們有:
A = XPCY
B = XCSY
在問題的原始製劑,P
被刪除並S
被插入。
後綴樹可以構建在O(n)
。在第一步中刪除最常見的後綴和前綴需要O(n)
。後綴樹遍歷在O(n)
完成。
也許是晚了,但我很困惑的要求。如果主要性能特徵是'O(n)',其中'n'是操作的數量,那麼總是不存在'O(1)'解決方案:刪除整個字符串A,然後插入整個字符串B? – angelatlarge
@angelatlarge你必須儘量減少刪除的字符數量 – rakesh