Вы можете решить эту проблему, используя Динамическое программирование и Хеширование .
Вычислить хэш каждого слова в словаре.Используйте хеш-функцию, которая вам нравится больше всего.Я бы использовал что-то вроде (a1 * B ^ (n - 1) + a2 * B ^ (n - 2) + ... + an * B ^ 0)% P, где a1a2 ... an - строка, n- длина строки, B - основание многочлена, а P - большое простое число.Если у вас есть хеш-значение строки a1a2 ... an, вы можете вычислить хеш-значение строки a1a2 ... ana (n + 1) за постоянное время: (hashValue (a1a2 ... an) * B + a(n + 1))% P.
Сложность этой части составляет O (N * M), где N - количество слов в словаре, а M - длина самого длинного слова в словаре..
Затем используйте функцию DP следующим образом:
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;
}
Сложность этого алгоритма составляет O (N * M), где N - длина строки, а M - этодлина самого длинного слова в словаре или O (N ^ 2), в зависимости от того, закодировано ли улучшение или нет.
Таким образом, общая сложность алгоритма будет: O (N1 * M) + O (N2 * M) (или O (N2 ^ 2)), где N1 - количество слов в словаре, M - длина самого длинного слова в словаре, а N2 - длина строки).
Если вы не можете придумать хорошую хеш-функцию (где нет столкновений), другое возможное решение - использовать Tries или Patricia trie (еслиразмер обычного файла очень велик) (я не смог опубликовать ссылки на эти темы, потому что моя репутация недостаточно высока, чтобы разместить более 2 ссылок).Но если вы используете это, сложность вашего алгоритма будет O (N * M) * O (время, необходимое для поиска слова в трие), где N - длина строки, а M - длина самого длинного слова.в словаре.
Надеюсь, это поможет, и я прошу прощения за мой плохой английский.