[英]Given string s, find the shortest string t, such that, t^m=s
給定字符串s,找到最短的字符串t,使得t ^ m = s。
例子:
s="aabbb" => t="aabbb"
s="abab" => t = "ab"
它能以多快的速度完成?
當然天真地,對於每m個除| s |,我可以嘗試子串(s,0,| s | / m)^ m = s。
可以在O(d(| s |)n)時間內找出解,其中d(x)是s的除數。 可以更有效地完成嗎?
這是計算字符串周期的問題。 Knuth,Morris和Pratt的順序字符串匹配算法是一個開始的好地方。 這是1977年題為“字符串中的快速模式匹配”的論文。
如果你想了解它,那么請查看Breslauer和Galil在1991年發表的論文“並行發現所有句號和初始回文”。從他們的摘要中:
給出了用於計算字符串的所有周期的最佳O(log log n)時間CRCW-PRAM算法。 以前的並行算法只有在短於字符串長度的一半時才計算周期。 該算法可用於在同一時間和處理器范圍內查找字符串的所有初始回文。 兩種算法在一般字母表中都是最快的。 我們通過修改先前已知的下限找到一個字符串的周期來得到一個尋找回文的下界[3]。 當p處理器可用時,邊界變為\\ Theta(dnpe + log log d1 + p = ne 2p)。
是的,你可以在O(|s|)
時間內完成。
您可以在O(n+m)
時間內在長度為m
的“源”字符串中搜索長度為n
的“目標”字符串。 基於此構建解決方案。
讓源和目標都是s
。 另一個約束是1和源中不分割|s|
任何位置 不是比賽的有效起始位置。 當然搜索本身總是會失敗。 但是如果有部分匹配且你已經到達了sourse字符串的末尾,那么你就可以解決原始問題。
我真的很喜歡這種稱為z算法的東西: http : //www.utdallas.edu/~besp/demo/John2010/z-algorithm.htm
對於每個位置,它計算從那里開始的最長子串,這也是整個字符串的前綴。 (當然是線性時間)。
a a b c a a b x a a a z
1 0 0 3 1 0 0 2 2 1 0
鑒於這個“z-table”,很容易找到所有可以對整個事物進行取冪的字符串。 如果pos+z[pos] = n
只需檢查所有位置。
在我們的情況下:
a b a b
0 2 0
這里pos = 2
給你2+z[2] = 4 = n
因此你可以使用的最短字符串是長度為2的字符串。
這甚至可以讓您找到只有指數字符串的前綴匹配的情況,例如:
a b c a
0 0 1
這里(abc)^2
可以縮減為原始字符串。 但是,當然,如果你不想要這樣的比賽,那就去看看除數。
對Boyer-Moore的修改可能在O(n)中處理這個問題,其中n是s的長度
http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.