我不知道是否有O(N)
解決方案,但通過與相反的比較,您會發現一個迴文序列。然後你有l-x
未配對的字母。 (如果你在這個詞的中間有一面鏡子,你可以把一個字母對看作它的反射。例如ab | ba)稍後,通過插入,你可以完成圖片。
現在,首先,我們如何找到兩個字符串共有的(最大)子序列?有尋找它看到在這裏 https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
當我們試圖找到S1和S2(S1的反向)之間的最長公共子序列(LCS),我們實際上發現的S1和第一上半年之間LCS的多項式算法半s2,s1的後半部分和s2的後半部分。 假設
S1 = abcddzac
所以S2 = cazddcba
。在這裏我們可以看到abcd
與cazd
(上半場)的比較,加上dzac
與dcba
(下半場)的比較。我們可以看到,兩個比較都是相同的,除了它們彼此相反,所以它們的連接必須是迴文,所以s1和s2的lcs必須是迴文。
一旦我們有了長度爲4的lcs(ad|da
),我們又有4個字母打破了對稱性(b,c,z,c)。然後我們爲每個字母插入一個字母來形成對稱,即迴文。我們設置我們的中間點作爲LCS的中點,並認爲我們打破S1爲兩個從中間點,所以我們有
S1 = a
BC d|d
ža
c和我們打破它像一根棍子成兩個從d | d,我們結束了:
d
ža
ç
d
CB a
現在我們只需LCS的字母之間填充,使他們都是一樣的。在我們的例子步驟如下:
d
ža
Ç
d
CB a
d
ža
Ç
d
ZCB a
d
ZC a
Ç
d
ZCB a
d
ZCB a
Ç
d
ZCB a
d
ZCB a
Ç
d
ZCB a
Ç
現在,我們從同一點別讓它和我們有
Ça
BCZ dd
ZCB a
這是一個迴文。
注意:cddc也是一個ldc,但不會改變步驟的數量。
看看這個[link](http://cs.stackexchange.com/questions/52416/proof-for-minimum-number-of-insertions-to-convert-a-string-toa-a-迴文) – harindersingh