ค้นหารูปแบบการทำซ้ำที่ยาวที่สุดในสตริง


9

ฉันกำลังมองหาอัลกอริทึมที่มีประสิทธิภาพเพื่อค้นหารูปแบบการทำซ้ำที่ยาวที่สุดในสตริง

ตัวอย่างเช่นพิจารณาสตริงตัวเลขต่อไปนี้:

5431428571428571428571428571427623874534.

อย่างที่คุณเห็น142857142857คือรูปแบบที่ยาวที่สุดซึ่งซ้ำกันสองสามครั้ง (อย่างน้อยสองครั้ง) ในสตริงนี้

สตริงที่ซ้ำกันไม่ควรมีความคิดใด ๆ มากกว่ากำลังดุร้าย?


3
คุณไม่ได้กำหนดความหมายของ "สองสามครั้ง" แต่ถ้า "สองครั้ง" นับเป็น "สองสามครั้ง" 142857นั่นก็ไม่นานที่สุดเพราะ142857142857ยาวกว่า ฉันคิดว่าคุณควรแก้ไขคำถามเพื่ออธิบายความหมายของคำว่า“ รูปแบบซ้ำ ๆ ”
Tsuyoshi Ito

จุดที่ดีมาก ฉันจะอัปเดตคำถาม

8
คุณต้องการให้เกิดการแยกออกจากกันหรือไม่? เพราะถ้าไม่ 142857142857 ยังคงไม่ซ้ำซ้อนที่ยาวที่สุด; 142857142857142857142 เกิดขึ้นสองครั้ง ไม่ว่าในกรณีใดคำตอบปกติของคำถามเช่นนี้คือ "ต้นไม้ต่อท้าย"

คำตอบ:


15

ปัญหาไม่น่าแปลกใจเลย ก่อนอื่นอัลกอริทึมกำลังสองเดรัจฉาน สี่เหลี่ยม ("รูปแบบซ้ำ ๆ ") ถูกกำหนดโดยความยาว และตำแหน่งและใช้เวลาในการตรวจสอบ ถ้าเราไปทั้งหมดและเราจะได้อัลกอริทึมเราสามารถปรับปรุงในครั้งแรกโดยที่วนลูปแล้วสแกนสตริงที่มีสองตัวชี้ทำงานที่ระยะห่างของ\ด้วยวิธีนี้เราสามารถตรวจสอบว่าตารางของความยาวอยู่ในเส้นเวลาให้รวมการทำงานของเวลา2)pO()pO(n3)2O(n2)

Kolpakov และ Kucherov พัฒนาอัลกอริทึมสำหรับการค้นหาทั้งหมดซ้ำสูงสุดในคำในเวลา [1] และขั้นตอนวิธีการของพวกเขาสามารถใช้ในการหาช่องสี่เหลี่ยมสูงสุดทั้งหมดในเวลา(n) ซ้ำเป็น subword ของแบบฟอร์มที่และเป็นคำนำหน้าที่เหมาะสมของWตารางที่ใหญ่ที่สุดที่มีอยู่ในการทำซ้ำที่เป็น 2 การใช้สูตรนี้เนื่องจากคำซ้ำสูงสุดทั้งหมดในคำ (ซึ่งมีเพียงจำนวนมาก) หนึ่งสามารถค้นหาสี่เหลี่ยมที่ใหญ่ที่สุดO(n)O(n)wkxk2xw(wk/2)2O(n)


[1] Kolpakov, R. , & Kucherov, G. (1999) หาซ้ำสูงสุดในคำในเวลาเชิงเส้น ในรากฐานของวิทยาศาสตร์คอมพิวเตอร์, 1999. การประชุมวิชาการประจำปีครั้งที่ 40 ใน (หน้า 596-604) IEEE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.