我是一個相當知名的問題谷歌搜索,即:the longest palindromic substring
我發現建議後綴嘗試作爲一個很好的解決方案的鏈接問題。
例子SO和Algos
該方法(據我所知)例如爲一個字符串S
創建Sr
(這是S
反轉),然後創建一個通用後綴trie。
然後找到S
和Sr
這個最長的常見懸索,它是從根到最深節點的路徑,它屬於S
和Sr
。
因此,使用後綴嘗試方法的解決方案基本上減少到Find the longest common substring
問題。
我的問題是:
如果輸入字符串是:S = 「abacdfgdcaba」
如此,Sr = 「abacdgfdcaba」
最長的公共子是abacd
這是不是迴文。
所以我的問題是:使用後綴的方法嘗試錯誤?我在這裏誤解/誤讀嗎?最長的迴文子串和後綴trie
2
A
回答
4
是,通過LCS算法一樣尋找最長的迴文是不是一個好辦法,我沒仔細看參考答案,但此行的答案是完全錯誤的:
所以中的最長的迴文所含一個字符串,正是這個字符串的最長公共子和其反向
,但如果你讀它,你有一個反例不必擔心它(你是對的99%),這是常見的錯誤,但簡單的方法如下:
如下所示寫下字符串(barbapapa
):#b#a#r#b#a#p#a#p#a#
,現在從左到右遍歷這個新字符串的每個字符,檢查其左右兩側以檢查它是否是迴文中心。在最壞的情況下,這個算法是O(n^2),並且完全正確。但通常會在O(n)中找到迴文(確實證明這在平均情況下很難)。最糟糕的情況是字符串有太多長迴文,如aaaaaa...aaaa
。
但是有更好的方法需要O(n)次,這個算法的基礎是由Manacher。相關算法比我在參考答案中看到的更復雜。但我所提供的是Manacher算法的基本思想,算法中的巧妙變化可以跳過檢查所有左邊和權限(也有通過使用後綴樹的算法)。
P.S:由於我的互聯網限制,我看不到您的Algo鏈接,我不知道它是否正確。
我說我的討論與OP澄清算法:
let test it with barbapapa-> #b#a#r#b#a#p#a#p#a#, start from first #
there is no left so it's center of palindrome with length 1.
Now "b",has # in left and # in right, but there isn't another left to match with right
so it's a center of palindrome with length 3.
let skip other parts to arrive to first "p":
first left and right is # second left and right is "a", third left and
right is # but forth left and right are not equal so it's center of palindrome
of length 7 #a#p#a# is palindrome but b#a#p#a#p is not
Now let see first "a" after first "p" you have, #a#p#a#p#a# as palindrome and this "a"
is center of this palindrome with length 11 if you calculate all other palindromes
length of all of them are smaller than 11
而且使用#
是因爲考慮偶數長度的迴文。
找到新創建的字符串中的迴文中心後,找到相關的迴文(知道中心和長度),然後刪除#
找出最大的迴文。
相關問題
- 1. Trie最長的前綴匹配
- 2. 最長的迴文前綴
- 3. 後綴樹和最長的重複子字符串問題
- 4. Trie與後綴樹與後綴數組
- 5. C++中的後綴Trie
- 6. 所有後綴的最長前綴字符串長度
- 7. 最長前綴後綴
- 8. 字符串匹配中的前綴與後綴Trie
- 9. 使用Trie找到最長的公共子串
- 10. 後綴樹:最長的重複子字符串實現
- 11. 最長的重複子字符串後綴樹dfs
- 12. 最長的迴文前綴Complextity
- 13. 最長迴文子串澄清
- 14. 使用後綴數組實現最長公用子字符串
- 15. 通用後綴樹遍歷查找最長公共子串
- 16. 最長共同後綴
- 17. 最長公共後綴前綴
- 18. 算法找到最長後綴的字符串和所述字符串的前綴之間的長度
- 19. 後綴樹(二進制字符串):查找最長的子字符串
- 20. 爲什麼我們不使用前綴樹(trie)來查找最長的公共子字符串?
- 21. 使用OOP/C++實現後綴Trie
- 22. Trie迭代器,後綴排序
- 23. Solr Numerical Trie vs傳統trie(前綴樹)
- 24. 計算字符串中最長的迴文子字符串
- 25. 找到最長的字符串前綴
- 26. Python中的Trie(前綴樹)
- 27. SQL最長前綴字符串
- 28. 最長的迴文字符串
- 29. 前綴匹配/ trie for Java?
- 30. 最長的重複子串
'也有算法通過使用後綴樹'這部分我沒有得到。這不是我的OP嗎?我的意思是,如果我們使用後綴樹,這將是爲了通過'S'和'Sr'使用'S'和'Sr'的生成後綴樹找到最長的公共子字符串。所以我們最終以我的原始問題結束。那麼你在這裏意味着什麼? – Cratylus
@ user384706,實際上我不知道他們是如何使用後綴樹的,我之前讀過Manacher的算法,但是據我所知,所有其他算法都對Manacher算法有所改進,爲了使它更容易和更實用,我沒有認爲相關的後綴樹算法正在使用(S,Sr),但我不確定。但是你提到的答案是錯誤的*,如果你對後綴樹的用法更感興趣,你應該閱讀相關論文(不確定鏈接),你可以在我引用的wiki頁面上找到它們(如果你有權下載他們,我也認爲你可以在網上免費找到他們)。 –
爲什麼我們需要'#'?我不清楚'#'如何幫助 – Cratylus