กำหนดสตริงผมอยากจะหาที่ยาวที่สุดในการทำซ้ำ (อย่างน้อยสองครั้ง) subsequence นั่นคือผมอยากจะพบสตริงซึ่งเป็น subsequence (ที่ไม่จำเป็นต้องเป็นที่ต่อเนื่องกัน) ของเช่นว่าw' นั่นคือคือสตริงที่แบ่งครึ่งปรากฏเป็นสองเท่าในแถว โปรดทราบว่าคือองค์ประกอบของแต่ไม่จำเป็นต้องเป็นสตริงย่อย
ตัวอย่าง:
สำหรับ 'ababccabdc' มันจะเป็น 'abcabc' เพราะ 'abc' = 'abc' และ 'abc' จะปรากฏขึ้น (อย่างน้อย) สองครั้งใน 'ababccabdc'
สำหรับ 'addbacddabcd' ตัวเลือกหนึ่งคือ 'dddd' เพราะ 'dd' ปรากฏขึ้นสองครั้ง (ฉันไม่สามารถใช้ตัวอักษรเดียวกันหลาย ๆ ครั้งได้ แต่ที่นี่ฉันมี 4 'd ดังนั้นมันก็โอเค) แต่มันก็ดีกว่า 4 ความยาว 8: 'abcdabcd' เนื่องจาก 'abcd' เป็นซับสตริงของ 'addbacddabcd' ที่ปรากฏสองครั้ง
ฉันสนใจที่จะหาลำดับการวนซ้ำที่ยาวที่สุด นี่เรียกอีกอย่างว่า "การค้นหาสแควร์ที่ยาวที่สุด / ใหญ่ที่สุด" แต่ฉันได้อ่านบทความมากมายที่สแควร์ถูกกำหนดไว้สำหรับสตริงย่อยและไม่ได้สำหรับการเรียงลำดับ
ฉันสามารถใช้อัลกอริทึมแรงเดรัจฉานที่จะใช้โดยวนซ้ำตัวเลือกทั้งหมดสำหรับเบรกพอยต์ในสตริงและจากนั้นฉันจะมีสองสายที่ฉันจะมองหาส่วนประกอบที่ใหญ่ที่สุด / ยาวที่สุดทั่วไป แต่การตรวจสอบแต่ละจะใช้เวลาโดยใช้เทคนิคการเขียนโปรแกรมแบบไดนามิกเพื่อให้ตลอดเวลาจะเป็น3) ผมพบว่าขั้นตอนวิธีการที่มีประสิทธิภาพมากขึ้นสำหรับ subsequence ทั่วไปที่ยาวที่สุดซึ่งจะใช้เวลาดังนั้นเวลาทำงานจะเป็นn})
ฉันกำลังมองหาอัลกอริทึมที่มีประสิทธิภาพมากขึ้นสำหรับปัญหาการวนซ้ำที่ยาวที่สุด บางทีความคิดของฉันในการวนซ้ำจุดพักทั้งหมดทำให้เสียเวลามากเกินไปและสามารถลดการทำซ้ำให้น้อยลงได้ หรือบางทีอัลกอริทึมที่มีทัศนคติที่แตกต่างสามารถแก้ปัญหานี้ได้
ฉันค้นหาในวารสารและคำถามก่อนหน้ามากมายและผลลัพธ์ส่วนใหญ่ที่ฉันพบมีเกี่ยวกับสตริงย่อยและไม่เกี่ยวกับการเรียงลำดับ
ฉันยังอ่านด้วยว่าสิ่งนี้สามารถทำได้โดยใช้ต้นไม้ต่อท้าย แต่นี่ก็เกี่ยวข้องกับสารตั้งต้นและฉันไม่แน่ใจว่าแนวคิดดังกล่าวสามารถขยายออกไปได้
ฉันกำลังมองหาวิธีการแก้ปัญหาที่วิ่งในเวลา2) หากมีอยู่ในเวลาว่าจะดียิ่งขึ้น (ผมไม่แน่ใจว่าถ้าเช่นมี)
$
แก้ปัญหา LCS