Đếm số palindromes trong một chuỗi trong python
Một chuỗi là một palindrome khi nó đọc ngược cũng như đọc xuôi và một chuỗi con là một chuỗi các ký tự liền kề trong chuỗi. Trong bài viết này, chúng ta sẽ thảo luận về nhiều cách tiếp cận để tìm số lượng chuỗi con palindromic trong một chuỗi đã cho như
Hãy để chúng tôi thảo luận về tất cả chúng từng cái một trong bài viết này Ví dụ. Đầu vào. str = "eaaebeb" Trong giải pháp brute force, chúng ta lấy từng chuỗi con theo cách tiếp cận con trỏ và kiểm tra xem nó có phải là một palindrome hay không Thực hiện Triển khai phương pháp Brute Force trong C++
Đối với một chuỗi đầu vào có độ dài n, sẽ có tổng số chuỗi con O(n^2). Việc kiểm tra từng chuỗi con để xem nó có phải là một bảng màu hay không sẽ mất thời gian tuyến tính vì chúng ta sẽ phải xem xét từng ký tự của chuỗi con chính xác một lần nếu đó là một bảng màu. Do đó, việc kiểm tra từng chuỗi con mất O(n) thời gian Do đó, để kiểm tra tất cả các chuỗi con và trả về tổng số chuỗi con palindromic trong chuỗi đầu vào ban đầu, phương thức brute force sẽ mất O(n^3) thời gian
Bây giờ chúng ta hãy thảo luận nếu có một giải pháp tốt hơn cho vấn đề này phương pháp đệ quyNếu i và j là chỉ số bắt đầu và chỉ số kết thúc của chuỗi thì, thuật toán
Thực hiện Triển khai phương thức đệ quy của chúng tôi trong C++
Đối với cách tiếp cận đệ quy này, chúng tôi quan sát thấy rằng trong cây đệ quy có các bài toán con chồng chéo và do đó, chúng tôi có thể giải quyết nó một cách hiệu quả bằng Quy trình động Phương pháp lập trình động từ dưới lênĐể triển khai phương pháp lập trình động từ dưới lên, chúng tôi xem xét hai mảng 2 chiều dp và p có kích thước n X n , trong đó n là độ dài chuỗi. thuật toán
Thực hiện
Độ phức tạp về thời gian. O(n^2) Ở đây khi chúng ta sử dụng hai mảng 2 chiều để lập trình động, do đó, không gian phụ cần có là O(n^2) và do đó, Độ phức tạp của không gian. O(n^2) Chúng ta cũng có thể có cách tiếp cận lập trình động từ trên xuống như được thảo luận bên dưới Phương pháp tiếp cận từ trên xuống DPTop Down DP là phiên bản ghi nhớ của phương pháp đệ quy Để triển khai cách tiếp cận từ trên xuống, chúng tôi khởi tạo hai mảng 2D. dp[n][n] và p[n][n] trong đó n là độ dài của chuỗi dp[i][j] lưu trữ số chuỗi con palindromic từ i đến j và p[i][j] lưu trữ 1 nếu chuỗi con từ i đến j là palindromic và 0 nếu không thuật toán
Ngoài ra, trong khi tìm xem chuỗi con từ i đến j có thuộc loại xuôi ngược hay không, chúng ta có một mảng 2 chiều p, trong đó p[i][j] lưu trữ kết quả nếu chuỗi con từ i đến j có thuộc dạng xuôi ngược hay không Thực hiện
Như chúng ta đã thấy rằng sử dụng phương pháp lập trình động, chúng ta có độ phức tạp không gian là O(n^2). Vì vậy, bây giờ chúng ta hãy xem liệu có thể có cùng độ phức tạp thời gian nhưng độ phức tạp không gian tốt hơn bằng cách sử dụng một số thuật toán khác không Thuật toán của người quản lý. Để tìm một bảng màu, chúng ta bắt đầu từ tâm của chuỗi và so sánh từng ký tự theo cả hai hướng. Nếu các ký tự tương ứng ở cả hai bên (trái và phải của tâm) khớp nhau, thì chúng sẽ tạo thành một bảng màu. Để tìm Chuỗi con Palindromic dài nhất của một chuỗi có độ dài n, chúng tôi lấy mỗi tâm 2n + 1 có thể, thực hiện khớp ký tự theo cả hai hướng trái và phải tại mỗi tâm và theo dõi LPS. Nếu chúng ta cần tính Chuỗi con Palindromic dài nhất tại mỗi vị trí trục từ trái sang phải, thì thuộc tính đối xứng của palindromic có thể giúp tránh một số tính toán không cần thiết. Nếu có một bảng màu có độ dài L nào đó có tâm ở bất kỳ vị trí P nào, thì chúng ta có thể không cần so sánh tất cả các ký tự ở bên trái và bên phải ở vị trí P+1 vì chúng ta đã tính LPS ở các vị trí trước P và chúng có thể giúp tránh . Thuật toán này được gọi là thuật toán manacher Thuật toán manacher đã sửa đổi Ý tưởng ở đây là chúng tôi sửa đổi thuật toán của người quản lý theo cách mà chúng tôi coi mỗi ký tự của chuỗi đầu vào là trục đóng vai trò là trung điểm của một bảng màu và mở rộng nó theo cả hai hướng để tìm số đếm tất cả các bảng màu có độ dài chẵn và lẻ thay vì chỉ thuật toán
Thực hiện Triển khai thuật toán của chúng tôi bằng thuật toán Manacher đã sửa đổi trong C ++ Phân tích độ phức tạp của Thời gian và Không gianTrong thuật toán này, chúng ta có 2n – 1 trục (n trục cho các chuỗi con có độ dài lẻ và n-1 trục cho các chuỗi con có độ dài chẵn) đóng vai trò là điểm giữa cho các chuỗi con palindromic có thể. Đối với mỗi điểm giữa, chúng tôi mở rộng sang trái và phải một ký tự tại một thời điểm và mở rộng chuỗi con cho đến khi chuỗi con mới nhất không phải là một bảng màu. Do đó, đối với mỗi điểm trục, chúng tôi xem xét tối đa n ký tự. Do đó, thuật toán của chúng tôi mất O(n) thời gian cho mỗi trục và có O(n) trục trong chuỗi đầu vào. Do đó, độ phức tạp về thời gian của giải pháp của chúng tôi là O(n^2) Vì chúng tôi không sử dụng bất kỳ không gian phụ trợ nào nên độ phức tạp của không gian là O(1) Độ phức tạp về thời gian. O(n^2) Độ phức tạp của không gian. Ô(1) Với bài viết này tại OpenGenus, bạn phải có ý tưởng đầy đủ về cách tìm số chuỗi con palindromic một cách hiệu quả |