Để tìm được các mẫu chung, chúng ta cần thuật toán chuỗi con chung. Chuỗi con chung là chuỗi con dài nhất gồm các ký tự có chung của hai chuỗi theo đúng thứ tự từ trái sang phải. Ví dụ chuỗi bcaaa và chuỗi aaabc có chung aaa, hay chuỗi x12y3z và chuỗi a11b22c33 có chung 123. Chúng tôi tìm chuỗi con chung bằng thuật toán sau
string mcs(string s1, string s2) { sconfgraph conf;
init_graph(conf, s1);
for(i=0; length(s2); i++) for(st ∈ conf)
if( found_char(s2[i], st) ) add_state(st, s2[i], conf); st = find_longest_state(conf);
return create_string(st, conf); }
Bảng 2-27. Thuật toán chuỗi con chung
Thuật toán này hoạt động bằng cách xây dựng chuỗi con cũng như phát triển chuỗi con từ các ký tự của một chuỗi dọc theo chuỗi còn lại. Sơ đồ chuyển hình trạng sẽ lưu giữ thông tin cho phép ta xác định chuỗi con dài nhất. Ta sẽ duyệt dọc theo trạng thái dài nhất ngược về đầu để xây dựng chuỗi con chung. Dưới đây là ví dụ về thuật toán chuỗi con chung
Chuỗi con
được duyệt
Đồ thị chuyển hình trạng
b c a a a (*, aaabc, *) Ban đầu ta có hình trạng (*, aaabc, *) gồm ba thành phần. Phần đầu là con trỏ tới hình trạng sinh ra nó, phần hai là chuỗi còn lại, và phần ba là chuỗi con
c a a a (*, aaabc, *) (0, c, b)
Khi ký tự b được lấy, có một hình trạng duy nhất chứa và cũng chứa chữ b nên một hình trạng mới sinh ra đó là (0, c, b)
(0, c, b) (1, *, bc)
cùng hình trạng (1, *, bc) nên chỉ một hình trạng được thêm vào
a a (*, aaabc, *) (0, c, b) (1, *, bc) (0, aabc, a)
Khi ký tự a được lấy, chỉ có hình trạng ban đầu chứa chữ a nên chúng ta chỉ thêm được một hình trạng (0, aabc, a)
a (*, aaabc, *)
(0, c, b) (1, *, bc) (0, aabc, a) (3, abc, aa)
Khi ký tự a tiếp theo được lấy, có hai hình trạng chứa chữ a nên chúng ta có hai hình trạng mới. Tuy nhiên (*, aaabc, *) sinh (0, aabc, a) đã có, nên chúng ta chỉ thêm được (3, abc, aa)
* (*, aaabc, *) (0, c, b) (1, *, bc) (0, aabc, a) (3, abc, aa) (4, bc, aaa)
Khi ký tự a cuối cùng được lấy, có ba hình trạng chứa chữ a tuy nhiên (*, aaabc, *) sinh (0, aabc, a) đã có và (0, aabc, a) sinh (3, abc, aa) đã có nên chúng ta chỉ thêm (4, bc, aaa)
Dựa vào danh sách hình trạng ta có danh sách các chuỗi con, đó là *, b, bc, a, aa, aaa và tìm thấy aaa là lớn nhất.
Bảng 2-28. Ví dụ về thuật toán chuỗi con chung
Để nhận dạng được mẫu tổng quát trong tập tin, ta cần bỏ qua một số véc tơ thừa và chỉ để lại các véc tơ gần với mẫu. Điều này có thể được thực hiện bằng cách giữ nguyên trạng thái khi gặp một véc tơ không mong muốn thay vì chuyển về trạng thái ban đầu như bình thường. Hầu hết các chương trình dịch vẫn dùng chiến lược này để phân tích tiếp tập tin.