Có tồn tại một thuật toán lập trình động để tìm chuỗi con dài nhất trong chuỗi X không chứa Y làm chuỗi con không? Chỉ là vấn đề này có vẻ rất giống với các thuật toán chuỗi DP khác, chẳng hạn như chuỗi và chuỗi chung dài nhất. Nó phải có khả năng xử lý các lần xuất hiện của Y trùng nhau.
Có vẻ như đây có thể là sự cố DP 2 trạng thái, với trạng thái [s_pose, t_pose] là chuỗi dài nhất của chuỗi S bắt đầu từ s_pose không có sting T [t_pose..M] dưới dạng chuỗi con. N là độ dài của chuỗi S và M là độ dài của chuỗi T. Tuy nhiên, các chuyển đổi của tôi không đúng: nó không nhận được trường hợp S = aaabc
và T = aabc
. Vấn đề nằm ở câu lệnh khác - Tôi không biết cách chuyển đổi nếu các ký tự bằng nhau. Thật ra tôi cảm thấy rằng nhánh nếu sai ... có ai biết điều gì có thể sai không?
Nó thậm chí không thành công trong trường hợp S = aaab
và T = aab
. Tôi có thể giải thích tại sao nó thất bại: giả sử tôi gọi giải quyết (0, 0). giải quyết (0, 0) cuộc gọi giải quyết (1, 1). giải quyết (1, 1) cuộc gọi giải quyết (2, 2). Vì s [2]! = T [2], nó khởi động lại tìm kiếm từ giải (3, 0). Tuy nhiên, aab là một chuỗi con và nó không bao giờ kiểm tra điều này hoặc xem xét trường hợp này ...
int solve(int s_pos, int t_pos)
{
if (s_pos >= N || t_pos >= M) return 0;
if (t_pos == M - 1 && s[s_pos] == t[t_pos]) return 0;
int ret = 0;
if (s[s_pos] != t[t_pos])
{
int tmp = solve(s_pos + 1, 0);
ret = max(ret, tmp + 1);
}
else
{
for (int i = s_pos + 1; i < N; i++)
{
int tmp = solve(i, t_pos + 1);
if (tmp != 0)
{
ret = max(ret, 1 + tmp);
}
}
}
return ret;
}