ขั้นตอนวิธีการของคุณคือไม่ถูกต้อง ฉันสมมติว่าคุณรู้วิธีคำนวณอาเรย์ต่อท้ายและอาร์เรย์ LCP ของสตริงนั่นคือการใช้งานอย่างมีประสิทธิภาพ ดังที่ได้กล่าวไว้ในความคิดเห็นคุณควรพยายามทำความเข้าใจว่าแต่ละองค์ประกอบคืออะไรและทำไมจึงใช้งานได้
ประการแรกคืออาร์เรย์ส่วนต่อท้าย ( ) ของสตริง อาเรย์ต่อท้ายนั้นโดยทั่วไปแล้วคำต่อท้ายทั้งหมดของสตริงS ที่จัดเรียงตามลำดับพจนานุกรม โดยเฉพาะอย่างยิ่งค่าS [ ผม]แสดงให้เห็นว่าคำต่อท้ายของSเริ่มต้นจากตำแหน่งS [ ผม]เป็นอันดับฉันในการสั่งซื้อพจนานุกรมของคำต่อท้ายทั้งหมดของSSASSA[i]SSA[i]iS
ถัดไปคืออาร์เรย์L C P [ ผม]บ่งบอกถึงความยาวของทั่วไปที่ยาวที่สุดคำนำหน้าระหว่างคำต่อท้ายที่เริ่มต้นจากS [ ฉัน- 1 ]และS [ ผม ] นั่นคือมันติดตามความยาวของคำนำหน้าทั่วไปที่ยาวที่สุดในหมู่คำต่อท้ายที่สองของSเมื่อเรียงตามลำดับพจนานุกรมLCPLCP[i]SA[i−1]SA[i]S
เป็นตัวอย่างให้พิจารณาสตริงส่วนต่อท้ายในการสั่งซื้อพจนานุกรมจะ{ , ขขขค, ขค, b ขค, ขขขค, ขค, ค}ดังนั้นS = [ 7 , 1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca}สำหรับอาร์เรย์ 1 ที่จัดทำดัชนี L C Pอาร์เรย์จะเป็น L C P = [ - , 1 , 2 , 0 , 1 , 1 , 0 ]SA=[7,1,4,3,2,5,6]LCPLCP= [ - , 1 , 2 , 0 , 1 , 1 , 0 ]
ตอนนี้ได้รับสองสายและBเรา concatenate พวกเขาเป็นS = # Bที่#เป็นตัวละครที่ไม่ได้อยู่ในทั้งสองและB เหตุผลในการเลือกตัวละครดังกล่าวเป็นไปเพื่อที่ว่าเมื่อคำนวณ LCP ของทั้งสองคำต่อท้ายกล่าวว่าข# วันที่ขงและขงการเปรียบเทียบจะแตกออกในตอนท้ายของสตริงแรก (เพราะมันเกิดขึ้นครั้งเดียว สองคำต่อท้ายที่แตกต่างกันจะไม่ได้อยู่ในตำแหน่งเดียวกัน) และจะไม่"ล้น"ในสายอื่นABS= A # B#ABa b # da b da b d
ตอนนี้จะเห็นได้ว่าคุณควรเห็นว่าทำไมคุณต้องเห็นค่าติดต่อกันในอาร์เรย์ (อาร์กิวเมนต์จะขึ้นอยู่กับความขัดแย้งและความจริงที่ว่าคำต่อท้ายในS Aอยู่ในลำดับพจนานุกรม) ตรวจสอบอาร์เรย์L C Pต่อไปเพื่อหาค่าสูงสุดซึ่งคำต่อท้ายสองรายการที่เปรียบเทียบจะไม่ได้อยู่ในสตริงต้นฉบับเดียวกัน หากพวกเขาไม่ได้อยู่ในสตริงเดิมที่เหมือนกัน (อันหนึ่งเริ่มต้นในAและอีกสตริงในB ) ดังนั้นค่าที่ใหญ่ที่สุดคือความยาวของสตริงย่อยทั่วไปที่ใหญ่ที่สุดL CPSAL CPAB
เป็นตัวอย่างให้พิจารณา= ขคขคและB = ขค จากนั้นS = ขคขค# ขค ส่วนต่อท้ายที่เรียงลำดับแล้วคือ{ a b c # b c , a b c a b c # b c , b c , b c # b c , b c aA = a b c a b cB = b cS= a b c a b c # b c } S{ a b c # b c , a b c a b c # b c , b c , b c # b c , b c a b c # b c , c , c # b c , c a b c # b c }
SAL CP= [ 4 , 1 , 8 , 5 , 2 , 9 , 6 , 3 , 7 ]= [ - , 3 , 0 , 2 , 2 , 0 , 1 , 1 , 0 ]
ตอนนี้คุ้มค่ามากที่สุดคือแต่มันเป็นS [ 1 ]และS [ 2 ]ซึ่งทั้งสองเริ่มต้นในสตริง ดังนั้นเราจึงเพิกเฉย ในทางตรงกันข้ามL C P [ 4 ] = 2สำหรับS A [ 3 ] (สอดคล้องกับคำต่อท้ายb cของB ) และS A [ 4 ]L CP[ 2 ] = 3SA [ 1 ]SA [ 2 ]AL CP[ 4 ] = 2SA [ 3 ]ขคBSA [ 4 ](สอดคล้องกับคำต่อท้ายของA ) ดังนั้นนี่คือสตริงย่อยทั่วไปที่ยาวที่สุดระหว่างสองสตริง สำหรับการรับสตริงย่อยที่เกิดขึ้นจริงที่คุณจะใช้ความยาว2 (มูลค่าที่ยิ่งใหญ่ที่สุดที่เป็นไปได้L C P ) substring เริ่มต้นจากทั้งS [ 3 ]หรือS [ 4 ]ซึ่งเป็นขคb c a b c # b cA2 L CPSA [ 3 ]SA [ 4 ]ขค