我無意中遇到了一個採訪問題: 查找給定字符串中最小大小爲2的所有重複子字符串。 該算法應該是高效的。查找給定字符串中的所有重複子字符串
以上問題的代碼在下面給出,但效率不高。
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
#include <string>
using namespace std;
int main()
{
typedef string::const_iterator iterator;
string s("ABCFABHYIFAB");
set<string> found;
if (2 < s.size())
for (iterator i = s.begin() + 1, j = s.end(); i != j; ++i)
for (iterator x = s.begin(); x != i; ++x)
{
iterator tmp = mismatch(i, j, x).second;;
if (tmp - x > 1)
found.insert(string(x, tmp));
}
copy(found.begin(), found.end(),ostream_iterator<string>(cout, "\n"));
}
我的問題是,是否有可在時間實現上述問題的 O(N)的複雜性的任何數據結構?
如果你的答案是後綴樹或哈希請詳細說明。
如果我理解正確,你會認爲輸出中有兩個不同的子字符串,如果它們的開始索引不同,而不是它們的內容不同,對嗎? – Skiminok 2012-04-07 14:16:41
閱讀後綴樹,在我看來,wiki是一個很好的開始:http://en.wikipedia。org/wiki/Suffix_tree – dexametason 2012-04-07 14:28:39
@dexametason您正在提出最佳解決方案。重複子字符串是CS中非常常見的問題。你能把這個作爲解決方案發布嗎?這對網站訪客會有幫助。乾杯! – 2012-04-08 08:53:04