สมมติว่าเราได้รับสตริง 'input_str' ถ้าเรากำหนดคำต่อท้ายทั้งหมดจาก input_str; ตัวอย่างเช่น ถ้าสตริงคือ 'abcd' ส่วนต่อท้ายคือ 'abc', 'bcd', 'cd', 'd' ตอนนี้ เราตรวจสอบความคล้ายคลึงกันระหว่าง input_str และส่วนต่อท้ายทั้งหมดด้วยความยาวของคำนำหน้าที่ยาวที่สุดใน input_str และส่วนต่อท้าย ต้องส่งคืนผลรวมของความคล้ายคลึงระหว่าง input_str และส่วนต่อท้ายทั้งหมด
ดังนั้น หากอินพุตเป็นเหมือน input_str ='tpotp' ผลลัพธ์จะเป็น 7
คำต่อท้ายทั้งหมดจากสตริง 'tpotp' คือ 'tpotp', 'potp', 'otp', 'tp' และ 'p'
หากเราตรวจสอบความคล้ายคลึงของคำต่อท้ายทั้งหมดด้วย input_str เราจะได้ -
'tpotp' similarity 5 'potp' similarity 0 'otp' similarity 0 'tp' similarity 2 'p' similarity 0 Sum of similarities = 5 + 0 + 0 + 2 + 0 = 7.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- return_list :=รายการใหม่ที่มีขนาดของ input_str
- ผม :=1
- p :=0
- q :=0
- r :=0
- ในขณะที่ฉัน <ขนาดของ input_str ทำ
- ถ้า q
- ถ้า return_list[i-q]>=q+p-i แล้ว
- r :=q + p - i
- p :=0
- q :=0
- มิฉะนั้น
- แทรก return_list[i-q] ที่ส่วนท้ายของ return_list
- ผม :=ผม + 1
- r :=0
- ถ้า return_list[i-q]>=q+p-i แล้ว
- ถ้า q
- มิฉะนั้น
- ในขณะที่ (i + r <ขนาดของ input_str) และ (input_str[r] เท่ากับ input_str[i+r]) ทำ
- r :=r + 1
- ใส่ r ที่ส่วนท้ายของ return_list
- p :=r
- q :=ฉัน
- ผม :=ผม + 1
- r :=0
- ในขณะที่ (i + r <ขนาดของ input_str) และ (input_str[r] เท่ากับ input_str[i+r]) ทำ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(input_str): return_list = [len(input_str)] i = 1 p, q = 0,0 r = 0 while i < len(input_str): if q < i < (q+p): if return_list[i-q] >= q+p-i: r = q + p - i p, q = 0, 0 else: return_list.append(return_list[i-q]) i += 1 r = 0 else: while i + r < len(input_str) and input_str[r] == input_str[i+r]: r += 1 return_list.append(r) p,q = r,i i += 1 r = 0 return sum(return_list) print(solve('tpotp'))
อินพุต
'tpotp'
ผลลัพธ์
5