Это действительно сложная проблема, если ваша строка не содержит токенов, идентифицирующих разрывы слов (например, пробелы). Один из способов, который я знаю из попыток решить анаграммы, таков:
В начале строки вы начинаете с одного символа. Это слово? Это может быть слово типа «А», но оно также может быть частью слова типа «AN» или «АНАЛОГ». Таким образом, решение о том, что это слово, должно быть принято с учетом всей строки. Вы должны рассмотреть следующие символы, чтобы узнать, можете ли вы сделать другое слово, начиная с первого символа, следующего за первым словом, которое, по вашему мнению, вы могли найти. Если вы решите, что слово «A», а у вас осталось «NALOG», то вскоре вы обнаружите, что больше нет слов, которые можно найти. Когда вы начинаете находить слова в словаре (см. Ниже), вы понимаете, что делаете правильный выбор, где разбивать слова. Когда вы перестаете находить слова, вы знаете, что сделали неправильный выбор, и вам нужно вернуться назад.
Большая часть этого - наличие словарей, достаточных для того, чтобы содержать любое слово, с которым вы можете столкнуться. Английским ресурсом будет TWL06 или SOWPODS или другие словари скрэббл, содержащие много непонятных слов. Для этого вам нужно много памяти, потому что если вы сравните слова с простым массивом, содержащим все возможные слова, ваша программа будет работать невероятно медленно. Если вы анализируете свой словарь, сохраняете его как список и воссоздаете словарь, ваша проверка будет достаточно быстрой, но для этого потребуется гораздо больше места на диске и больше места в памяти. Один из этих больших словарей скрэббл может расшириться до 10 МБ с фактическими словами в качестве ключей и простым NSNumber в качестве заполнителя для значения - вам все равно, какое значение, просто то, что ключ существует в словаре, который говорит вам, что слово признается действительным.
Если вы сохраняете массив при подсчете, вы можете выполнить [подсчет массива] триумфально, добавив в него последнее слово, содержащее последние символы, но у вас также есть простой способ возврата. Если в какой-то момент вы перестаете находить правильные слова, вы можете вытолкнуть lastObject из массива и заменить его в начале строки, а затем начать искать альтернативные слова. Если это не поможет вам вернуться на правильный путь, выведите другое слово.
Я бы поэкспериментировал, ища потенциальные три слова впереди при разборе строки - когда вы определили три потенциальных слова, уберите первое слово, сохраните его в массиве и найдите другое слово. Если вы обнаружите, что это слишком медленно, и вы получаете хорошие результаты, учитывая, что впереди всего два слова, отбросьте его до двух. Если вы обнаружите, что слишком много тупиков в вашей стратегии разделения слов, увеличьте количество слов, которые вы считаете нужным.
Другим способом будет использование правил естественного языка - например, «A» и «NALOG» могут выглядеть хорошо, потому что согласный следует за «A», но «A» и «ARDVARK» будут исключены, потому что это будет правильно для слова, начинающегося с гласного, чтобы следовать «AN», а не «A». Это может быть настолько сложным, насколько вам нравится, - я не знаю, упрощается ли это на японском языке или нет, но, безусловно, есть общие глагольные окончания, такие как "ma su".
(редактировать: началось вознаграждение, я хотел бы знать, как лучше всего это сделать, если не так.)