Bài toán xâu con chung dài nhất

Đây là bài toán tìm một xâu (string) hoặc nhiều xâu là xâu con của hai hoặc nhiều xâu. Không nên nhầm lẫn giữa bài toán này với Bài toán chuỗi con chung dài nhất.

Xâu con dài nhất của "ABAB", "BABA" và "ABBA" là các xâu "AB" và "BA" với độ dài bằng 2. Các xâu con khác (có độ dài ngắn hơn là "A" và "B").

ABAB
 |||
 BABA
 ||
ABAA

Định nghĩa bài toán

[sửa | sửa mã nguồn]

- Định nghĩa: Cho hai xâu S độ dài m và xâu T độ dài n, tìm xâu có độ dài lớn nhất là xâu con của cả hai xâu S và T. - Tổng quát hóa bài toán này là bài toán tìm xâu con k-chung (k-common substring problem): Cho một tập xâu , trong đó và Σ. Với mỗi giá trị k thỏa mãn 2 ≤ , tìm các xâu con chung dài nhất của ít nhất xâu.

Thuật toán

[sửa | sửa mã nguồn]

Có thể tìm độ dài và vị trí bắt đầu của các xâu con dài nhất của S và T trong bằng cách sử dụng Cây hậu tố khái quát (Generalized suffix tree). Ngoài ra cũng có thể giải quyết bài toán theo phương pháp Quy hoạch động với độ phức tạp .

Độ phức tạp của bài toán tổng quát tương ứng là ·...·.

Cây hậu tố

[sửa | sửa mã nguồn]
Cây hậu tố tổng quát cho các xâu "ABAB", "BABA" và "ABBA", được đánh số tương ứng 0, 1 và 2.

Quy hoạch động

[sửa | sửa mã nguồn]

Có thể tìm các hậu tố (suffix) dài nhất của các tiền tố (prefix) của các xâu. Hậu tố dài nhất được định nghĩa:

Ví dụ với hai xâu "ABAB" và "BABA":

A B A B
0 0 0 0 0
B 0 0 1 0 1
A 0 1 0 2 0
B 0 0 2 0 3
A 0 1 0 3 0

Hậu tố dài nhất của các tiền tố có thể của các xâu ST chính là xâu con dài nhất của chúng. Các xâu con này được đánh dấu theo đường chéo, màu đỏ trong bảng. Ví dụ: các xâu con dài nhất là "BAB" và "ABA":

Có thể mở rộng phương pháp này để tìm xâu con dài nhất của nhiều xâu hơn nữa bằng cách đưa thêm 1 chiều vào bảng cho mỗi xâu mới.

function LCSubstr(S[1..m], T[1..n])

L:= array(0..m, 0..n)
z:= 0
ret:= {}
for i:= 1..m
  for j:= 1..n
  if S[i] = T[j]
  if i = 1 or j = 1
 L[i,j]:= 1
  else
 L[i,j]:= L[i-1,j-1] + 1
  if L[i,j] > z
 z:= L[i,j]
 ret:= {}
  if L[i,j] = z
 ret:= ret ∪ {S[i-z+1..i]}
return ret

Thuật toán dùng quy hoạch động có độ phức tạp là .

Tham khảo

[sửa | sửa mã nguồn]
Chúng tôi bán
Bài viết liên quan
Nhân vật Tokitou Muichirou - Kimetsu no Yaiba
Nhân vật Tokitou Muichirou - Kimetsu no Yaiba
Tokito Muichiro「時透 無一郎 Tokitō Muichirō​​」là Hà Trụ của Sát Quỷ Đội. Cậu là hậu duệ của Thượng Huyền Nhất Kokushibou và vị kiếm sĩ huyền thoại Tsugikuni Yoriichi.
Tóm tắt chương 229: Quyết chiến tại tử địa Shunjuku - Jujutsu Kaisen
Tóm tắt chương 229: Quyết chiến tại tử địa Shunjuku - Jujutsu Kaisen
Vì Sukuna đã bành trướng lãnh địa ngay lập tức, Angel suy luận rằng ngay cả Sukuna cũng có thể tái tạo thuật thức bằng phản chuyển
Du lịch Thái Lan – Hòa mình vào lễ hội té nước Songkran
Du lịch Thái Lan – Hòa mình vào lễ hội té nước Songkran
Người dân và khách đi tour Thái Lan đang tưng bừng trong lễ mừng năm mới và lễ hội té nước, với các lễ hội đầy màu sắc và niềm vui
Review game Firewatch - Chuyện của những người gác lửa rừng
Review game Firewatch - Chuyện của những người gác lửa rừng
Firewatch là câu chuyện về những con người chạy trốn khỏi cuộc đời mình, câu chuyện của những người gác lửa rừng.