Bảng phím tắt

Nhấn hoặc để di chuyển giữa các chương

Nhấn S hoặc / để tìm kiếm nội dung

Nhấn ? để hiện thị bảng phím tắt

Nhấn Esc để ẩn bảng phím tắt

Thuật toán Z

Thuật toán Z là một thuật toán xử lí xâu. Một trong những ứng dụng phổ biến của thuật toán Z là để giải quyết bài toán so khớp chuỗi.

vector<int> zArray(const string &s) {
	int n = s.size();
	vector<int> z(n, 0);
	for(int i = 1, l = -1, r = -1; i < n; ++i) {
		if(i < r) z[i] = min(r - i, z[i - l]);
		
		while(i + z[i] < n && s[z[i]] == s[i + z[i]]) ++z[i];

		if(i + z[i] > r) {
			l = i;
			r = i + z[i];
		}
	}
	return z;
}

Độ phức tạp thuật toán là \(O(|S|)\).

Để sử dụng thuật toán Z nhằm giải quyết bài toán so khớp chuỗi, ta xây dựng mảng Z trên xâu lớn giống như ở thuật toán KMP, sau đó tìm các vị trí \(i\) thoả mãn \(z_i = |S|\).

vector<int> stringMatching(string &s, string &t){
	int n = s.size(), m = t.size();
	vector<int> z = zArray(s + '#' + t);
	vector<int> idx;
	for(int i = 0; i < (int)z.size(); ++i) {
		if(z[i] == n) idx.emplace_back(i - n - 1);
	}
	return idx;
}