Chuỗi dài nhất không có chuỗi


8

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 = aaabcvà 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 = aaabvà 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;
}

1
tìm tất cả các chuỗi con Y trong X và tìm khoảng cách dài nhất giữa chúng
ratchet freak

Nếu chúng trùng nhau thì sao? (các lần xuất hiện)
user83834

1
Có vẻ như quá nhiều một bài tập về nhà theo sở thích của tôi để đưa ra một giải pháp đầy đủ. Đây là một gợi ý: nếu bạn biết cho một vị trí nhất định có độ dài nhất cho đến vị trí đó và vị trí dài nhất kết thúc ở vị trí đó, bạn có thể cập nhật vị trí đó cho vị trí tiếp theo không?
AProgrammer

@AProgrammer Bởi tiếp theo bạn có nghĩa là vị trí i + 1?
dùng83834

@ratchetfreak nếu X là OPPOPPO và Y là OPPO, sẽ không có khoảng cách. Nhưng việc dài nhất sẽ là bỏ qua O: OPPPPO giữa.
dùng83834

Câu trả lời:


1

Cái này cần phải dùng mẹo. Tôi đã viết nó trong một mã meta tương tự như cơ bản.

LONGEST = ""
while N>0
  POS = find(T,S)
  if POS>0 then
    SUB = left(S,POS)
  else
    SUB = S
    POS = N
  endif
  if len(SUB) > len(LONGEST) then
    LONGEST = SUB
  endif
  N = N-POS
wend

0

Tôi nghĩ vấn đề chính là vòng lặp for của bạn bên trong câu lệnh khác, sau đó gọi hàm đệ quy.

Chọn một cách tiếp cận, hoặc đệ quy hoặc lặp lại, nhưng trộn chúng có vẻ sai.

Tôi sẽ đi với cách tiếp cận lặp đi lặp lại.

Tôi sẽ tạo một danh sách trống bên ngoài chức năng.

Rồi gọi solve.

Trong chức năng này hãy thử phương pháp này:

Lặp qua chuỗi: Nếu ký tự hiện tại không phải là bắt đầu của chuỗi sau thì đặt ký tự trong chuỗi giữ. Điều này sẽ xây dựng một chuỗi. Nếu nó bắt đầu sau đó thì thêm các ký tự đó vào một chuỗi giữ khác. Đánh dấu có bao nhiêu trận đấu bạn có so với sau đó. Mỗi nhân vật, nếu đã khớp với nhân vật tiếp theo, sau đó nhìn xem liệu nó có khớp với nhân vật đầu tiên không, sau đó nếu nó phù hợp với nhân vật ở vị trí tiếp theo được khớp. Nếu nó phù hợp với phần tiếp theo thì mọi thứ trước đó (trong chuỗi giữ) sẽ được đưa vào danh sách.

Vì vậy, về cơ bản, bạn cần theo dõi những gì có thể là một chuỗi có thể có thể giành chiến thắng và bạn cần theo dõi rằng một chuỗi có thể nằm trong một chuỗi khác.

Bạn có thể cần nhiều chuỗi giữ, nhưng thực hiện một cách tiếp cận đơn giản, với hai chuỗi giữ, sau đó đi qua các ví dụ khác nhau và viết ra những gì đang xảy ra trong mỗi bước cho đến khi bạn thấy nếu cần một chuỗi giữ khác.


-1

Tôi nghĩ bạn cần coi chuỗi con Y giống như một biểu thức thông thường và biến nó thành DFA. Sau đó, bạn chuyển đầu vào qua DFA, theo dõi thời gian tồn tại kể từ khi bạn có trận đấu. Có vẻ như là một vấn đề thời gian tuyến tính, giả sử kích thước của đầu vào lớn hơn nhiều so với độ phức tạp của chuỗi khớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.