Giả sử ta có chuỗi s, tìm độ dài chuỗi con dài nhất giữa hai ký tự bằng nhau, không tính hai ký tự đó. Nếu không tìm thấy, trả về -1.
Ví dụ: s = "level", kết quả 3 vì chuỗi con tối ưu là "lev" hoặc "vel".
Giải thuật
memo := {}(map ký tự → danh sách chỉ mục)- For
itừ 0 đếnlen(s)-1:- Nếu
s[i]trongmemo: thêmivàomemo[s[i]] - Ngược lại:
memo[s[i]] = [i]
- Nếu
best := 0- Với mỗi
keytrongmemo:best := max(best, memo[key][-1] - memo[key][0])
- Trả về
best - 1
Ví dụ (Python)
def solve(s):
memo = {}
for i in range(len(s)):
if s[i] in memo:
memo[s[i]].append(i)
else:
memo[s[i]] = [i]
best = 0
for key in memo:
best = max(best, memo[key][-1] - memo[key][0])
return best - 1
s = "level"
print(solve(s))
Input
"level"
Output
3