Tìm tất cả các cách có thể để chèn một mẫu vào chuỗi


7

Tôi đã suy nghĩ về vấn đề này một thời gian và tôi chỉ có thể tìm ra giải pháp đệ quy nhưng tôi cảm thấy rằng có một cách lập trình động để thực hiện nó, tôi chỉ không thể tìm ra nó. Đây có phải là một vấn đề nổi tiếng mà tôi không biết?


Q: Cho một chuỗi và một mẫu, trả về số cách duy nhất khớp các chữ cái của mẫu (theo thứ tự) với chuỗi.

Làm rõ: Để tìm một kết quả khớp, bạn lấy ký tự đầu tiên của mẫu, tìm ký tự khớp đầu tiên trong chuỗi, sau đó bạn lấy ký tự thứ hai của mẫu và khớp với ký tự khớp đầu tiên của chuỗi đó SAU tính cách.

Ví dụ 1 (4 trận đấu):

Chuỗi: DABBCDDE

Hoa văn: ABD

Các cách có thể (ký tự in đậm là nơi mẫu được khớp với chuỗi):

  • D AB BC D DE
  • D A B B C D DE
  • D AB BCD D E
  • D A B B CD D E

Ví dụ 2 (0 trận đấu):

Chuỗi: ABC

Hoa văn: BCA

(Bạn khớp B, C và sau đó bạn ở cuối chuỗi, bạn KHÔNG thể quay lại và khớp với các ký tự trước đó)


Với cách tiếp cận đệ quy, tôi có một phương pháp theo dõi chỉ số nào tôi đang ở trên chuỗi ( s Index ) cũng như mẫu ( p Index ). Nếu mẫu [s Index] khớp với mẫu [p Index], chúng ta gọi lại phương thức và tăng s Index và p Index. Nếu không - chỉ cần tăng s Index và thử lại để tìm trận đấu. Phương thức trả về tổng số sau đó vì giá trị trả về của các cuộc gọi đệ quy được cộng lại với nhau. (Các trận đấu thêm 1, không có trận đấu nào thêm 0)

Trường hợp cơ sở:

  • Nếu p Index lớn hơn chiều dài của mẫu, trả về 0.

  • Nếu s Index lớn hơn độ dài của chuỗi, trả về 1 (chúng tôi đã tìm thấy kết quả khớp!)


Có những giải pháp nào khác?


Các giá trị trùng lặp được phép trong mẫu? Chúng tôi có đảm bảo cả mẫu và chuỗi theo thứ tự không?
Brandon Arnold

Có giá trị trùng lặp được cho phép trong mẫu. Tôi không biết nếu tôi làm cho mình quá rõ ràng, nhưng nếu bạn tranh giành trật tự, thì vấn đề sẽ thay đổi. Vì vậy, nếu bạn có CBA là chuỗi và mẫu là ABC, bạn không có kết quả khớp vì trận đấu đầu tiên là A, và sau đó không có thêm ký tự nào trong chuỗi để khớp với các ký tự còn lại của bạn trong mẫu (BC). Nó làm cho nó rõ ràng?
Daniel Olsson

Tôi thấy insertingkhá sai lệch. Đây không phải là yếu tố phù hợp patternvới các yếu tố stringtheo thứ tự theo cách có thể?
Mai

Đã xóa câu trả lời regex của tôi, bởi vì sau khi chơi trên js fiddle tôi phát hiện ra nó không khớp với tất cả các hoán vị có thể có :(
Gavin Clarke

1
Mai, đó là sự thật, tôi sẽ thay đổi từ ngữ.
Daniel Olsson

Câu trả lời:


1

Tôi nghĩ bạn không cần sử dụng Lập trình động để giải quyết vấn đề này. Tôi nghĩ rằng đây là giải pháp:

  1. Trước hết hãy lập danh sách các danh sách để duy trì sự xuất hiện của các ký tự trong mẫu trong văn bản đã cho.

  2. Nó sẽ như thế này

Sơ đồ sau:

   A    B    D 
             0 
   1 -> 2 -> 5
        3    6 
  1. Điều này ngụ ý (giả sử chỉ số 0) A xảy ra ở vị trí 0, B xảy ra ở 2,3 vị trí, D xảy ra ở 0,5,6 vị trí.

  2. Đối với mỗi cặp cột liên tiếp (ở đây A, B và B, D) sử dụng các con trỏ để ánh xạ các giá trị tương ứng trong một cột thành các giá trị lớn hơn tiếp theo trong cột tiếp theo. Ở đây 1 (trong col1) có một con trỏ đến 2 (trong col2) và 2 (trong col2) có một con trỏ đến 5 (trong col3) vì 0 nhỏ hơn 2. 3 (trong col2) có một con trỏ đến 5 (trong col3 ) (Tôi không thể vẽ ở đây).

  3. Đối với mỗi giá trị trong cột đầu tiên, hãy tìm số cách có thể bằng cách sử dụng các con trỏ. Ở đây 1 -> 2 và 2 -> 5 và vì vậy số cách có thể là 2 * 2 cách (nghĩa là 1-> 2-> 5, 1-> 2-> 6, 1-> 3-> 5, 1 -> 3-> 6). Bạn chỉ cần nhân số lượng phần tử còn lại trong cột cho mỗi giá trị của A.

  4. Ở đây chỉ có 1 giá trị cho Cột1 (tức là A). Nếu có nhiều cột, chúng tôi tính giá trị cho mỗi giá trị của A bằng cách sử dụng các con trỏ và tính tổng tất cả chúng để có được số cách.

  5. Tôi nghĩ rằng độ phức tạp là O (n) khi xây dựng danh sách là O (n), không gian con trỏ và thời gian xây dựng là O (n).


Điều này là chính xác, nhưng bạn cần phải cụ thể hơn về việc tạo ra các lần xuất hiện của các chữ cái mẫu. Độ phức tạp cho đó là O (nm) trong đó n là chiều dài mẫu và m chiều dài văn bản. (chúng ta cần tìm tất cả các lần xuất hiện của từng chữ cái trong mẫu).
Adrian Buzea
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.