Hãy xem xét số lượng tuyệt đối các phân tách có thể có cho một chuỗi nhất định. Nếu bạn có n
ký tự trong chuỗi, có n-1
các vị trí có thể tách ra. Ví dụ: đối với chuỗi cat
, bạn có thể chia trước a
và bạn có thể chia trước t
. Điều này dẫn đến 4 phân đoạn có thể có.
Bạn có thể xem vấn đề này là chọn nơi bạn cần chia chuỗi. Bạn cũng cần phải chọn bao nhiêu phần chia sẽ có. Vì vậy, có Sum(i = 0 to n - 1, n - 1 choose i)
các phân đoạn có thể có. Bởi các Binomial Coefficient Theorem, với x và y cả hai là 1, điều này là tương đương với pow (2, n-1).
Đã cấp, rất nhiều tính toán này dựa trên các vấn đề con phổ biến, vì vậy, Dynamic Programming có thể tăng tốc thuật toán của bạn. Trên đỉnh đầu của tôi, tính toán một boolean matrix M such M[i,j] is true if and only if the substring of your given string from i to j is a word
sẽ giúp đỡ khá nhiều. Bạn vẫn có một số mũ có thể phân đoạn có thể, nhưng bạn sẽ nhanh chóng có thể loại bỏ phân khúc nếu phân tách đầu không tạo thành một từ. Một giải pháp sau đó sẽ là một chuỗi các số nguyên (i0, j0, i1, j1, ...) với điều kiện là j sub k
= i sub (k + 1)
.
Nếu mục tiêu của bạn đúng là URL trường hợp lạc đà, tôi sẽ bỏ qua vấn đề và trực tiếp tìm hiểu thêm: Nhận trang chủ cho URL, xóa mọi khoảng trắng và viết hoa khỏi HTML nguồn và tìm kiếm chuỗi của bạn. Nếu có kết quả phù hợp, hãy tìm phần đó trong HTML gốc và trả lại. Bạn sẽ cần một mảng của NumSpaces khai báo bao nhiêu khoảng trắng xảy ra trong chuỗi ban đầu như vậy:
Needle: isashort
Haystack: This is a short phrase
Preprocessed: thisisashortphrase
NumSpaces : 000011233333444444
Và câu trả lời của bạn sẽ đến từ:
location = prepocessed.Search(Needle)
locationInOriginal = location + NumSpaces[location]
originalLength = Needle.length() + NumSpaces[location + needle.length()] - NumSpaces[location]
Haystack.substring(locationInOriginal, originalLength)
Tất nhiên, điều này sẽ phá vỡ nếu madduckets .com không có "Mad Duckets" ở đâu đó trên trang chủ. Than ôi, đó là mức giá bạn phải trả để tránh vấn đề về số mũ.
Thực ra, nó không cần tốn kém như vấn đề ba lô. Bạn có thể áp dụng các kỹ thuật lập trình động để giảm đáng kể không gian tìm kiếm. –
Có, đồng ý với Nick Johnson: đây là một vấn đề lập trình năng động tiêu chuẩn, đơn giản O (n^2). Ném trong một vấn đề NP-hoàn thành giống như cố gắng để cắt bánh mì với một jackhammer !!! –