Có một thuật toán để kiểm tra nếu một chuỗi là một catenation của palindromes?


9

Có một thuật toán thời gian tuyến tính để kiểm tra xem một chuỗi các ký tự có phải là một chuỗi các palindromes không? Điều duy nhất nảy ra trong đầu tôi là giải pháp ngây thơ:

1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat

Lưu ý: câu trả lời là có nếu tầm thường 1 chuỗi được xác định là palindromes. Hãy giả sử rằng đây không phải là trường hợp.


14
Nếu bạn cho phép các palindromes tầm thường có độ dài 1 (ví dụ: chuỗi "a" là một palindrom) thì tất cả các chuỗi đều là các chuỗi của palindromes.
Matt Lewis

Nó hữu ích, hay một bài tập?
Jan Hudec

@MattLewis Bạn có thể cố gắng giảm thiểu số lượng palindromes. Tháng một, tại sao? Âm thanh như một bài tập tốt đẹp trong lập trình năng động.
Pål GD

1
@Haile Không phân biệt palindromes.
saadtaame

1
Norvig đã làm việc rộng rãi trên Palindromes. Bạn có thể quan tâm đến trang này: norvig.com/palindrome.html
robowolverine

Câu trả lời:


7

Giả sử bạn muốn phân biệt các palindromes, đây được gọi là vấn đề PALSTAR và có một thuật toán thời gian tuyến tính của Zvi Galil và Joel Seiferas. Thuật toán nhận dạng trực tuyến theo thời gian tuyến tính cho `` Palstar ' .

Bạn có thể tìm thấy lời giải thích về thuật toán trong cuốn sách ở đây: Thuật toán văn bản (xem trang được liên kết và các trang trước).

Nếu bạn ổn với thuật toán thời gian bậc hai, lập trình động thẳng tiến dường như hoạt động.

s[1,n]s[1,j]

s[i,j]O(n2)Θ(n)O(n)

s[1,j+1]1ij1s[1,i]s[i+1,,j+1]Θ(n2)Θ(n2)

O(n)s[i+1,j+1]ij11


Điều này tương tự như thuật toán của tôi, tôi chỉ không giải thích phần tiền xử lý để biến nó thành bài tập cho OP, nhưng tôi không biết tại sao không ai quan tâm đến thuật toán của tôi :)

@SaeedAmiri: Bạn đã đọc phần đầu tiên trong câu trả lời của tôi có đề cập đến thời gian tuyến tính chưa? Nó giống như thế nào? btw, OP đã thay đổi câu hỏi để yêu cầu thuật toán thời gian tuyến tính, điều này làm cho câu trả lời của bạn và nửa câu trả lời sau của tôi không liên quan. Tôi đã không xóa phần đó khỏi câu trả lời của mình, vì tôi muốn đề cập đến thuật toán của Manacher khiến thuật toán lập trình động chỉ sử dụng không gian O (n) (và thoát khỏi bước tiền xử lý), và nó vẫn có thể phù hợp với những người khác. tình cờ bắt gặp câu hỏi này
Aryabhata

Đừng lấy nó ra, nó chỉ đùa thôi, tôi thích câu trả lời của bạn nói chung, tôi nghĩ có vấn đề với bài viết tiếng Anh của tôi, vì OP không hiểu giải pháp của tôi và tôi không thể vẽ nó ra bằng hình ảnh . Nhưng điểm tốt là OP đã thay đổi câu hỏi của anh ấy gần đây và có thể có một giải pháp tương tự như thuật toán của Manacher (nhưng thực sự không dễ).

1
@SaeedAmiri: Tôi hiểu rồi, đừng lo lắng :-)
Aryabhata

3

Nếu cho phép chồng lấp, nó có thể được thực hiện trong thời gian tuyến tính (theo kích thước của chuỗi đầu vào).

Một số định nghĩa

Hãy xác định khái niệm về palindrom tối đa :

Một palindrom tối đa bán kính k của một chuỗi S là một chuỗi con S 'sao cho

  • bắt đầu từ trung tâm, S 'đọc cùng một ký tự k theo cả hai hướng
  • nhưng không cho ký tự k + 1
  • k> 1 (vì vậy một ký tự không phải là một bảng màu)

ví dụ: if S = banana, thì S' = ananalà một palindrom tối đa của bán kính 2.

Một palindrom tối đa là một palindrom tối đa bán kính k cho một số k.

Ví dụ, nếu S = banana, "ana", "anana", tất cả đều palindromes tối đa của nó.

Sử dụng palindromes tối đa

Bây giờ, nếu chúng ta có thể định vị tất cả các palindrome tối đa của một chuỗi , sẽ rất đơn giản để kiểm tra xem toàn bộ chuỗi có phải là một chuỗi của palindromes hay không.

Đi S = abbaccazayaz. Palindromes tối đa của nó là:

  • abba, chính giữa vị trí 2 và 3, bán kính = 2
  • acca, chính giữa vị trí 5 và 6, bán kính = 2
  • zayaz, tập trung ở vị trí 10, bán kính = 2

vì vậy "abba" trải dài trên [1..4], "acca" kéo dài qua [4..7], "zayaz" kéo dài qua [8..12]. Vì sự kết hợp của ba palindromes này (cho phép chồng chéo?) Trải dài trên toàn bộ chuỗi, theo sau đó "abbaccazayaz" là nối của palindromes.

Tính toán palindromes tối đa trong thời gian tuyến tính

Bây giờ, hóa ra chúng ta có thể định vị tất cả các palindrome tối đa của một chuỗi S trong thời gian tuyến tính !*

Ý tưởng là sử dụng cây hậu tố cho S được trang bị các truy vấn tổ tiên chung thấp nhất thời gian không đổi .

Vì vậy, chúng ta có thể kiểm tra xem một chuỗi S có độ dài m có phải là một chuỗi các palindromes trong thời gian O (n) không.

* Gusfield, Dan (1997), "9.2 Tìm tất cả các palindromes tối đa trong thời gian tuyến tính", Thuật toán trên Chuỗi, Cây và Chuỗi


knanaanana

Đã chỉnh sửa điều "anana", cảm ơn bạn. Ngoài ra, OP không yêu cầu một chuỗi palindromes tối thiểu: cho rằng một char duy nhất không phải là một palindrom, chúng ta chỉ cần quyết định xem chuỗi đầu vào có phải là một chuỗi của palindromes hay không.
Haile

1
k=1

1
@Khaur Chỉ mất thời gian loglinear nếu các khoảng không được sắp xếp. Trong trường hợp này có lẽ họ là.
Yuval Filmus

1
Trong các bình luận cho câu hỏi, OP bổ sung rõ ràng rằng các palindromes chồng chéo không được phép. Vì vậy, giải pháp này ở dạng hiện tại không phải là những gì OP đang tìm kiếm. Tôi nghĩ rằng giải pháp này cũng có thể được sửa đổi để giải quyết trường hợp không chồng chéo, với một số suy nghĩ và độ phức tạp bậc hai. Nhưng tôi đã không suy nghĩ nhiều.
Paresh

2

Giả sử Palindrome [] [] là một mảng và Palindrome (i, j) là một hàm kiểm tra, liệu chuỗi con từ i đến j có phải là palindrom và trả về 1 nếu là palindrom hoặc trả về vô cực nếu không phải là palindrom và bạn đang tìm số nhỏ nhất của các phân vùng, tạo nó từ dưới lên:

Palindrome[i][i]=1.
0i<j<n:Palindrome[i][j]=min{Palindrome(i,j),minik<j{Palindrome[i,k]+Palindrome[i+1,k]}}

O(n2)O(n)O(n3)O(n2)


Bạn có thể minh họa bằng một ví dụ? Nói:abbaaccaabba.
saadtaame

@saadtaame, OK, ở đây không thể tạo bảng (trong cs.stackexchange) hoặc tôi không thể tìm ra cách để làm điều này, tôi sẽ làm điều này ở đâu đó và tôi sẽ đặt hình ảnh ở đây sau. nhưng bây giờ bạn cố gắng tự hiểu nó, bắt đầu từ các chuỗi con có độ dài 1, sau đó kiểm tra các palindrom có ​​độ dài 2, .... và cứ thế.
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.