Возможно, это поможет, если вы посмотрите на проблему следующим образом:
Для вашего примера у вас есть такая строка:
AA BB C DDDD E FFF
Космические позиции - это места, где вы можете начать новый столбец. В любом другом месте вы не должны хранить одинаковые буквы в одном столбце.
Таким образом, вы можете пометить позицию в космосе так:
AA1BB2C3DDDD4E5FFF
Теперь у вас есть 5 позиций, в которых вы можете либо разбить столбец, либо нет, так как это двоичное решение, используйте для этого строку из 0 и 1 и грубую силу для каждой возможной комбинации:
12345
00000 -> no break at all, column count = 1, max. lines = 13
...
01010 -> your example, column count = 3, max. lines = 5
...
11111 -> breaks everywhere, column count = 6, max. lines = 4
Это попытка грубой силы, но вы можете легко увидеть, что число 1 влияет на количество столбцов (количество столбцов = число 1 + 1), и вы хотите минимизировать макс. линий, это должно быть возможно как-то вычислить, не проверяя каждую комбинацию.
РЕДАКТИРОВАТЬ 2: Вы не узнали, что хотите 3 столбца, это облегчает задачу, поскольку вы знаете, что у вас будет только 3 1, но это все еще грубая сила.
РЕДАКТИРОВАТЬ: Другой подход, который я бы одобрил:
Напишите, что буквы считаются так:
A B C D E F
2 2 1 4 1 3
Теперь вы можете объединять буквы рядом друг с другом. Всегда выбирайте две буквы с наименьшей суммой:
2 2 1 4 1 3 - lowest = "2 1"
2 3 4 1 3 - lowest = "1 3"
2 3 4 4 - lowest = "2 3"
5 4 4 - stop now, as we have 3 columns now
Result: AABBC, DDDD, EFFF
Возможно, это не приведет к оптимальному решению, но я думаю, что это хороший и простой способ решить вашу проблему.