November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Wednesday, March 28th, 2018 02:46 pm

На входе: строчка из n букв (в основном, русских), например: “абук”, и дополнительное число m, например, 3.
Задача: сгенерировать из букв той строки ВСЕ возможные комбинации длиной m.

Количество этих комбинаций может быть достаточно велико: на первом месте одна из n букв, потом на втором одна из остальных n-1, потом одна из остальных n-2, и т.д.
Всего получается n!/(n-m)! . В вышеуказанном примере – 24 варианта, а если, например, 10 букв, из которых надо сгенерировать 5-буквенные комбинации, то их будет уже 30240.

Ну, я всё-таки довольно квалифицированный программист, поэтому вполне быстро написал эту програмку на питоне. Если кому интересно, могу показать. Но кто тут программисты, попробуйте сначала сами..

Оригинал этой записи в личном блоге.

Wednesday, March 28th, 2018 02:23 pm (UTC)
Вот за что я не люблю такие задачи - часто непонятно, что имелось в виду в условии.

Что значит "одна из n букв"?

Если буквы повторяются, скажем, на входе "аабук", то "ааб" - должно появиться на выходе? Или нет? Это разные "а" или одинаковые?

"бук" и "куб" - должны обе появиться?
Wednesday, March 28th, 2018 06:49 pm (UTC)
Тогда рекурсия глубиной m, видимо, поможет. С передачей набора букв без уже использованной.
Thursday, March 29th, 2018 08:26 am (UTC)
Очевидное - делать новую корзинку с буквами для передачи вниз, и не класть в неё одну, текущую.

Видимо, более простое - параллельно с массивом букв держать массив bool, показывающий, доступна ли буква, или использована.
При итерации по массиву букв пропускать использованные. Перед передачей вниз - помечать текущую как использованную. ПОсле вызова рекурсии - помечать как доступную.
Edited 2018-03-29 08:26 am (UTC)