ความท้าทายนี้เกี่ยวกับการเขียนรหัสเพื่อแก้ไขปัญหาต่อไปนี้
รับสองสาย A และ B รหัสของคุณควรส่งออกดัชนีเริ่มต้นและจุดสิ้นสุดของสตริงย่อยของ A ที่มีคุณสมบัติดังต่อไปนี้
- สตริงย่อยของ A ควรตรงกับสตริงย่อยบางส่วนของ B ด้วย
- ไม่ควรมีสตริงย่อยของ A ที่สอดคล้องกับคุณสมบัติแรกอีกต่อไป
ตัวอย่างเช่น:
A = xxxappleyyyyyyy
B = zapplezzz
สตริงย่อยapple
พร้อมดัชนี4 8
(การทำดัชนีจาก 1) จะเป็นเอาต์พุตที่ถูกต้อง
ฟังก์ชั่น
คุณสามารถสมมติว่าอินพุตจะเป็นแบบมาตรฐานในหรือในไฟล์ในไดเรกทอรีท้องถิ่นนั่นคือตัวเลือกของคุณ รูปแบบไฟล์จะเป็นสองสตริงโดยคั่นด้วยบรรทัดใหม่ คำตอบควรเป็นโปรแกรมแบบสมบูรณ์ไม่ใช่เพียงฟังก์ชั่น
ในที่สุดผมต้องการทดสอบรหัสของคุณทั้งสองที่นำมาจากสตริงสตริงในhttp://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/
คะแนน
นี่คือรหัสกอล์ฟที่มีเกลียว รหัสของคุณจะต้องทำงานในO(n)
เวลาซึ่งn
เป็นความยาวรวมของการป้อนข้อมูล
ภาษาและห้องสมุด
คุณสามารถใช้ภาษาใดก็ได้ที่มีคอมไพเลอร์ / ล่าม / อื่น ๆ สำหรับ Linux คุณควรใช้ไลบรารีโอเพ่นซอร์สมาตรฐานที่ไม่ได้ออกแบบมาเพื่อแก้ปัญหานี้ ในกรณีที่มีข้อโต้แย้งฉันจะนับเป็นห้องสมุดใด ๆ ที่มาพร้อมกับมาตรฐานกับภาษาของคุณหรือที่คุณสามารถติดตั้งในเครื่องอูบุนตูเริ่มต้นจากพื้นที่เก็บข้อมูลเริ่มต้น
ข้อมูลที่เป็นประโยชน์
มีอย่างน้อยสองวิธีในการแก้ปัญหานี้ในเวลาเชิงเส้น อันดับแรกคือการคำนวณต้นไม้ต่อท้ายและอันดับที่สองคือการคำนวณอาร์เรย์ต่อท้ายและอาร์เรย์ LCP ก่อน
- นี่คือคำอธิบายแบบเต็มและ (อาจมากกว่า -) รายละเอียดของการสร้างต้นไม้ต่อท้ายเชิงเส้นเวลา นอกจากนี้ยังมีคำตอบให้ดีมากเกี่ยวกับเส้นเวลาก่อสร้างต้นไม้ต่อท้ายที่https://stackoverflow.com/questions/9452701/ukkonens-suffix-tree-algorithm-in-plain-english มันมีลิงค์ไปยังซอร์สโค้ดด้วย สามารถอ่านคำอธิบายโดยละเอียดได้ที่นี่คราวนี้เป็นการแก้ปัญหาอย่างเต็มรูปแบบใน C
- ส่วนที่ 2 ของhttp://www.cs.cmu.edu/~guyb/realworld/papersS04/KaSa03.pdfให้อัลกอริธึมการสร้างอาร์เรย์ส่วนต่อท้ายเชิงเส้นตรงเวลาและภาคผนวก A มีซอร์สโค้ด C ++ คำตอบนี้จะบอกคุณว่าแล้วการคำนวณย่อยทั่วไปที่ยาวที่สุดhttps://cs.stackexchange.com/questions/9555/computing-the-longest-common-substring-of-two-strings-using-suffix-arrays หมวดที่ 5 ของhttps://courses.csail.mit.edu/6.851/spring12/scribe/lec16.pdfซึ่งมีวิดีโอบรรยายที่เกี่ยวข้องhttps://courses.csail.mit.edu/6.851/spring12/lectures/L16 .htmlยังอธิบายถึงอัลกอริทึมเดียวกันโดยเริ่มต้นที่ 1:16:00
O(n) time
คุณแน่ใจหรือว่าเป็นไปได้