Bạn có thể giải quyết vấn đề này bằng cách sử dụng Dynamic Programming và Hashing.
Tính băm của mỗi từ trong từ điển. Sử dụng hàm băm bạn thích nhất. Tôi sẽ sử dụng một cái gì đó như (a1 * B^(n - 1) + a2 * B^(n - 2) + ... + một * B^0)% P, trong đó a1a2 ... an là một chuỗi, n là độ dài của chuỗi, B là cơ sở của đa thức và P là số nguyên tố lớn. Nếu bạn có giá trị băm của chuỗi a1a2 ... bạn có thể tính giá trị băm của chuỗi a1a2 ... ana (n + 1) trong thời gian không đổi: (hashValue (a1a2 ... an) * B + a (n + 1))% P.
Độ phức tạp của phần này là O (N * M), trong đó N là số từ trong từ điển và M là độ dài của từ dài nhất trong từ điển.
Sau đó, sử dụng một chức năng DP như thế này:
bool vis[LENGHT_OF_STRING];
bool go(char str[], int length, int position)
{
int i;
// You found a set of words that can solve your task.
if (position == length) {
return true;
}
// You already have visited this position. You haven't had luck before, and obviously you won't have luck this time.
if (vis[position]) {
return false;
}
// Mark this position as visited.
vis[position] = true;
// A possible improvement is to stop this loop when the length of substring(position, i) is greater than the length of the longest word in the dictionary.
for (i = position; position < length; i++) {
// Calculate the hash value of the substring str(position, i);
if (hashValue is in dict) {
// You can partition the substring str(i + 1, length) in a set of words in the dictionary.
if (go(i + 1)) {
// Use the corresponding word for hashValue in the given position and return true because you found a partition for the substring str(position, length).
return true;
}
}
}
return false;
}
Sự phức tạp của thuật toán này là O (N * M), trong đó N là chiều dài của chuỗi và M là độ dài của từ dài nhất trong từ điển hoặc O (N^2), tùy thuộc vào bạn có mã hóa cải tiến hay không.
Vì vậy, tổng độ phức tạp của thuật toán sẽ là: O (N1 * M) + O (N2 * M) (hoặc O (N2^2)), trong đó N1 là số từ trong từ điển, M là độ dài của từ dài nhất trong từ điển và N2 là chiều dài của chuỗi).
Nếu bạn không thể nghĩ ra hàm băm tốt (không có va chạm), giải pháp có thể khác là dùng Tries hoặc Patricia Trie (nếu kích thước của Trie bình thường là rất lớn) (Tôi có thể 't đăng liên kết cho các chủ đề này bởi vì danh tiếng của tôi không đủ cao để đăng hơn 2 liên kết). Nhưng khi bạn sử dụng điều này, độ phức tạp của thuật toán sẽ là O (N * M) * O (Thời gian cần để tìm từ trong trie), trong đó N là độ dài của chuỗi và M là độ dài của từ dài nhất trong từ điển.
Tôi hy vọng điều đó sẽ hữu ích và tôi xin lỗi vì tiếng anh nghèo của tôi.
Đúng nếu tôi sai, nhưng giải pháp của bạn không đa thức. Có thể giải quyết điều này trong tối đa O (n^2) bằng cách sử dụng trie và DP (Nó thực sự là O (k) trong đó k là độ dài của từ dài nhất trong từ điển). Hãy cho tôi biết nếu bạn cần câu trả lời. – ElKamina
@ElKamina Cảm ơn. Tôi muốn nghe giải pháp DP – Michael