ให้สตริง input_str หาผลรวมของความคล้ายคลึงระหว่างสตริงต้นฉบับกับทุกซัฟฟิกซ์ โดยความคล้ายคลึงวัดจากความยาวของ Longest Common Prefix (LCP)
ตัวอย่าง: input_str = 'tpotp' ผลลัพธ์ = 7
ซัฟฟิกซ์ทั้งหมด: 'tpotp', 'potp', 'otp', 'tp', 'p'
'tpotp' similarity 5 'potp' similarity 0 'otp' similarity 0 'tp' similarity 2 'p' similarity 0 Sum = 5 + 0 + 0 + 2 + 0 = 7
ขั้นตอนการแก้ปัญหา (Z-Algorithm แบบปรับเปลี่ยน)
- สร้าง
return_listเริ่มต้นด้วย[len(input_str)] - ใช้ตัวแปร
i, p, q, rติดตามช่วงที่ตรงกันล่าสุด - วนลูป
iจาก 1 ถึงlen(input_str)-1:- ถ้าอยู่ในช่วงที่รู้จัก (
q < i < q+p) ใช้ค่า Z ที่คำนวณไว้ - มิฉะนั้น เปรียบเทียบตัวอักษรโดยตรงเพื่อหา
r
- ถ้าอยู่ในช่วงที่รู้จัก (
- คืนค่า
sum(return_list)
ตัวอย่างโค้ด
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')) # Output: 7อินพุต
'tpotp'
เอาต์พุต
7