Thuật toán nhanh nhất để tìm chuỗi sau palindrom dài nhất


8

Trước hết chúng ta phải đọc một từ, và một kích thước mong muốn.
Sau đó, chúng ta cần tìm palindrom dài nhất được tạo bởi các ký tự trong từ này được sử dụng theo thứ tự.
Ví dụ: cho size = 7 và word = "abcababac", câu trả lời là 7 ("abababa").

Postcript: kích thước của từ nhỏ hơn 3000.


Theo max palindrom, bạn có nghĩa là bạn có thể xóa các ký tự khỏi chuỗi để rời khỏi một palindrom và bạn muốn palindrom dài nhất (hoặc loại bỏ tối thiểu)?

1
Trong ví dụ của bạn, cũng có cababac có độ dài 7. Các ký tự bị loại bỏ nằm cạnh nhau và ở cuối. Bạn có được phép một trong những hạn chế này không? Họ đơn giản hóa việc tìm kiếm rất nhiều.

6
Điều này đã được trả lời trên Stack Overflow: làm thế nào để tìm ra chuỗi con palindromic dài nhất?

@GenericHuman: Câu trả lời hay nhất trong câu hỏi đó là tốt cho chương của sách giáo khoa mà người hỏi đang đọc. Đó không phải là một câu trả lời tốt cho người hỏi này. Xem câu hỏi này: stackoverflow.com/questions/7043778/ Thay thế.
Neil G

1
Làm thế nào là kích thước được sử dụng? Bạn nói rằng bạn muốn "tối đa palindrom", vậy nếu palindrom dài nhất dài hơn hoặc ngắn hơn kích thước đã cho thì sao?
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


6

Có một thuật toán được đặt tên theo thuật toán của Manacher, thuật toán này thực sự nhanh, thuật toán thời gian tuyến tính.

Xem tài liệu tham khảo của Wikipedia


Phần tái bút: Nếu bạn thực sự quen thuộc với Thuật toán Z , bạn sẽ thấy rằng chúng giống nhau.


Biên tập

Tôi vừa hiểu sai ý nghĩa của OP (nhưng tôi không muốn xóa thông tin về thủ tục. Nó hơi hữu ích). Anh ta có nghĩa là chuỗi dài nhất của chuỗi, vì vậy lập trình động có vẻ tốt: trong đó biểu thị độ dài của chuỗi palindrom dài nhất của và là khung Iverson tôi nghĩ nó giống như LCS .

fj,k= =tối đa(fj,k+1,fj+1,k,2[Sj= =Sk]+fj+1,k-1),j<kfk,k= =1fj,k= =0,j>k
fj,kSj..k[P]

4
Bạn đang trả lời trong trường hợp chuỗi con, nhưng câu hỏi là về các chuỗi.

Không phải thuật ngữ đầu tiên là f (j, k-1)?
Abhishek Bansal

5

Thuật toán nhanh nhất tôi có thể nghĩ đến là áp dụng LCS theo cách sáng tạo. Nó có thể giải quyết vấn đề này trong không gian O (N ^ 2) và không gian O (N ^ 2) trong đó N là kích thước của chuỗi.

LCS (S, đảo ngược (S)) sẽ cung cấp cho bạn chuỗi con palindromic lớn nhất, vì chuỗi con palindromic lớn nhất sẽ là chuỗi con lớn nhất giữa chuỗi S và đảo ngược của nó.

Ví dụ:
S = "abcababac"
T = "cababacba" (đảo ngược của S)
LCS (S, T) = "abababa"


Bạn có thể tranh luận thuật toán này là thuật toán nhanh nhất mà mọi người có thể nghĩ ra, như câu hỏi đang đặt ra không?
Juho

@Juho: Tôi không thể. :( Đây là thuật toán nhanh nhất mà tôi biết. Tuy nhiên, nó được chấp nhận tại thẩm phán trực tuyến UVA ( uva.onlinejudge.org/external/114/11404.html ) và trong ACM, các ràng buộc vấn đề chỉ có giải pháp tối ưu hóa mới vượt qua. Do đó, giải pháp này đủ nhanh, không chắc chắn về cách nhanh nhất.
Shashwat 22/03/13

2

Vấn đề tìm LPS của một chuỗi có thể được chuyển đổi thành tìm kết quả chung dài nhất của hai chuỗi. Trong trường hợp này, một chuỗi sẽ là một chuỗi gốc và chuỗi thứ hai sẽ đảo ngược với chuỗi gốc.

Vấn đề hậu quả chung dài nhất giống như vấn đề khớp mẫu, ngoại trừ việc bạn được phép bỏ qua các ký tự trong văn bản. Ngoài ra, mục tiêu là chỉ trả lại một trận đấu, càng lâu càng tốt.

O(n2)

O(n2/lgn)

AnBmtlog(t)O(1)Bsmt

  1. O(pn+nlgn)p

  2. O(p(m+1p)logn)mO(nlgn)

Các thủ tục chi tiết và thuật toán được giải thích trong bài báo của Hirschberg .

O(Rloglogn)RRO(n2)Rn


@FrankW, cảm ơn! Tôi đã chỉnh sửa câu trả lời. Bây giờ các liên kết có thể nhìn thấy.
Surendra

Định dạng của bạn vẫn còn thiếu; vui lòng kiểm tra chỉnh sửa của tôi để xem những gì có thể. Các tài liệu tham khảo bài viết vẫn còn xấu bởi vì họ dựa vào liên kết luôn hoạt động, mãi mãi. Xem ở đây để được tư vấn; tiêu đề, tác giả và năm nên được đưa ra (ít nhất).
Raphael

O()OΩ(n2)

-1

Có lẽ tôi đang thiếu một cái gì đó, bởi vì nó có vẻ khá tầm thường đối với tôi: Cố gắng ghép từng nhân vật với một nhân vật bằng nhau. Sau đó đặt ký tự đầu tiên của mỗi cặp ở bên trái, ký tự kia ở bên phải và nếu có bất kỳ ký tự nào còn lại (nghĩa là các ký tự không được ghép với một cặp khác), sau đó chọn một trong số chúng và đặt ký tự đó vào ở giữa.


1
aubvawbu,v,wabu,v,w
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.