Tôi lặp lại câu hỏi phỏng vấn: Để tìm tất cả chuỗi con lặp lại trong chuỗi đã cho với kích thước tối thiểu là 2. Thuật toán phải hiệu quả.Để tìm tất cả chuỗi con lặp lại trong một chuỗi đã cho
Mã cho câu hỏi trên được đưa ra bên dưới nhưng không hiệu quả.
#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"));
}
Câu hỏi của tôi là, có cấu trúc dữ liệu nào có thể thực hiện câu hỏi trên trong thời gian độ phức tạp của O (N)?
Nếu câu trả lời của bạn là cây Suffix hoặc Hashing hãy giải thích nó.
Nếu tôi hiểu chính xác, bạn xem xét hai (cùng kích thước) chất nền khác nhau trong đầu ra, nếu chỉ mục bắt đầu của chúng khác nhau, không phải nếu nội dung của chúng khác nhau, phải không? – Skiminok
Đọc về cây hậu tố, theo ý kiến của tôi, wiki là một khởi đầu tốt ở đây: http: //en.wikipedia.org/wiki/Suffix_tree – dexametason
@dexametason Bạn đang đề xuất giải pháp tốt nhất có thể. Các chuỗi con lặp lại là một vấn đề rất phổ biến trong CS. Bạn có thể vui lòng đăng bài này như là một giải pháp? Nó sẽ rất hữu ích cho khách truy cập trang web. Chúc mừng! –