Mô tả bài toán
Cho một chuỗi s. Hãy tìm tổng độ tương đồng của s với từng hậu tố của nó. Độ tương đồng giữa hai chuỗi là độ dài tiền tố chung dài nhất.
Ví dụ
Nếu đầu vào là s = "pqpqpp", thì đầu ra sẽ là 11 vì các hậu tố là "pqpqpp", "qpqpp", "pqpp", "qpp", "pp", "p". Độ tương đồng lần lượt là 6, 0, 3, 0, 1, 1. Tổng = 6 + 0 + 3 + 0 + 1 + 1 = 11.
Giải thuật (Z-Algorithm)
- Khởi tạo
length = len(s),total = length, mảngz = [0],l = 0,r = 0. - Duyệt
ktừ 1 đếnlength - 1:- Nếu
k > r: đặtmatch = 0,index = k, so sánh ký tự để mở rộngmatch. - Thêm
matchvàoz. - Nếu
match > 0: cập nhậttotal,l = k,r = index - 1. - Ngược lại: sử dụng giá trị đã tính trong
zđể tránh so sánh lại.
- Nếu
- Trả về
total.
Triển khai Python
def solve(s):
length = len(s)
total = length
z = [0]
l = 0
r = 0
for k in range(1, length):
if k > r:
match = 0
index = k
while index < length:
if s[index] == s[match]:
match += 1
index += 1
else:
break
z.append(match)
if match > 0:
total += match
l = k
r = index - 1
else:
if z[k - l] < (r - k) + 1:
z.append(z[k - l])
total += z[k - l]
else:
match = r - k
index = r
while index < length:
if s[index] == s[match]:
match += 1
index += 1
else:
break
z.append(match)
total += match
l = k
r = index - 1
return total
s = "pqpqpp"
print(solve(s))
Đầu vào
"pqpqpp"
Đầu ra
11