Thách thức này là về viết mã để giải quyết vấn đề sau.
Cho hai chuỗi A và B, mã của bạn sẽ xuất ra các chỉ số bắt đầu và kết thúc của một chuỗi con của A với các thuộc tính sau.
- Chuỗi con của A cũng phải khớp với một số chuỗi con của B.
- Không nên có chuỗi con của A thỏa mãn thuộc tính đầu tiên.
Ví dụ:
A = xxxappleyyyyyyy
B = zapplezzz
Chuỗi con apple
có chỉ số 4 8
(lập chỉ mục từ 1) sẽ là đầu ra hợp lệ.
Chức năng
Bạn có thể giả sử đầu vào sẽ đạt tiêu chuẩn trong hoặc trong một tệp trong thư mục cục bộ, đó là lựa chọn của bạn. Định dạng tệp sẽ chỉ đơn giản là hai chuỗi, cách nhau bởi một dòng mới. Câu trả lời phải là một chương trình đầy đủ và không chỉ là một chức năng.
Cuối cùng tôi muốn kiểm tra mã của bạn trên hai chuỗi được lấy từ các chuỗi trong http: // hgdoad.cse.ucsc.edu/goldenPath/hg38/chromosomes/ .
Ghi bàn
Đây là mã golf với một twist. Mã của bạn phải được chạy O(n)
đúng lúc, trong đó n
tổng chiều dài của đầu vào.
Ngôn ngữ và thư viện
Bạn có thể sử dụng bất kỳ ngôn ngữ nào có trình biên dịch / trình thông dịch / có sẵn miễn phí. cho Linux. Bạn chỉ nên sử dụng các thư viện mã nguồn mở tiêu chuẩn không được thiết kế để giải quyết nhiệm vụ này. Trong trường hợp có tranh chấp, tôi sẽ tính đây là bất kỳ thư viện nào đạt tiêu chuẩn với ngôn ngữ của bạn hoặc thư viện mà bạn có thể cài đặt trong máy ubfox mặc định từ kho lưu trữ mặc định.
Thông tin hữu ích
Có ít nhất hai cách để giải quyết vấn đề này trong thời gian tuyến tính. Một là trước tiên tính toán cây hậu tố và thứ hai là trước tiên tính toán mảng hậu tố và mảng LCP.
- Dưới đây là một lời giải thích đầy đủ và (có lẽ là quá mức) về việc xây dựng cây hậu tố thời gian tuyến tính (hóa ra một số số liệu không may bị nhầm lẫn). Ngoài ra còn có một câu trả lời SO rất hay về xây dựng cây hậu tố thời gian tuyến tính tại https://stackoverflow.com/questions/9452701/ukkonens-suffix-tree-alerskym-in-plain-english . Nó bao gồm một liên kết đến mã nguồn quá. Một lời giải thích chi tiết khác có thể được tìm thấy ở đây , lần này đưa ra một giải pháp đầy đủ trong C.
- Phần 2 của http://www.cs.cmu.edu/~guyb/realworld/ conS04 / KaSa03.pdf đưa ra thuật toán xây dựng mảng hậu tố thời gian tuyến tính và Phụ lục A có mã nguồn C ++. Câu trả lời này cho bạn biết cách tính chuỗi con phổ biến dài nhất https://cs.stackexchange.com/questions/9555/computing-the-longest-common-subopes-of-two-strings-USE-suffix-arrays . Mục 5 của https://cifts.csail.mit.edu/6.851/spring12/scribe/lec16.pdf cũng có một bài giảng video liên quan https://cifts.csail.mit.edu/6.851/spring12/lectures/L16 .html cũng giải thích thuật toán tương tự bắt đầu lúc 1:16:00.
O(n) time
Bạn có chắc là nó có thể?