2016-01-29 3 views
2

У меня есть строка, как это:Уникальная перестановка со странными круглыми повторениями

'RRSSTT' 
'RRRSSSTTT' 
'RRRRSSSSTTTT' 
etc... 

Мне нужно извлечь все уникальные перестановки с этим свойством:

  • «RRSSTT»; «RRTTSS»; «SSRRTT»; «SSTTRR»; «TTRRSS»; «TTSSRR» - это все те же строки, и
  • 'RSTRST'; «RTSRTS»; «TSRTSR»; «TRSTRS»; «SRTSRT»; «STRSTR» - это все те же строки.

С командой perms Получаю все перестановки (если строка имеет 6 элементов, перестановки 720). С помощью скрипта uperms я получаю всю уникальную перестановку (если строка содержит 6 элементов, перестановки - 90). Я нашел uperm на mathworks (http://www.mathworks.com/matlabcentral/fileexchange/27321-unique-random-permutations).

До сих пор все работает, но мне нужно написать/найти другой алгоритм, который генерирует перестановки с указанным выше специальным свойством. Если строка «RRSSTT», то требуемые перестановки должны быть 15.

Кто-то уже столкнулся с этой проблемой и мог мне помочь?

------ EDIT ------

Есть 15 goups эквивалентной строки, некоторые из примеров являются:

Group 1:   Group 6:  Group 11: 

'RSTTSR'   'RSTSTR'   'RSSTRT' 
'SRTTRS'   'SRTRTS'   'STSRRT' 
'STRRTS'   'STRTRS'   'RSRTTS' 
'RTSSTR'   'TRSRST'   'STTRSR' 
'TRSSRT'   'TSRSRT'   'TRRSTS' 
'TSRRST'   'RTSTSR'   'TRTSSR' 

Group 2:   Group 7:  Group 12: 

'RSTRST'   'RSSRTT'   'RSSTTR' 
'SRTSRT'   'SSTRRT'   'SRRTTS' 
'STRSTR'   'RRSTTS'   'STTRRS' 
'RTSRTS'   'STTSRR'   'TRRSST' 
'TRSTRS'   'TRRTSS'   'TSSRRT' 
'TSRTSR'   'TTRSSR'   'RTTSSR' 

Group 3:   Group 8:  Group 13: 

'RSTSRT'   'SRRSTT'   'SRSTTR' 
'STRSRT'   'SSRTTR'   'SRRTST' 
'RSTRTS'   'RRTSST'   'RTRSST' 
'STRTSR'   'TSSTRR'   'TSSRTR' 
'TRSRTS'   'RTTRSS'   'TSTRRS' 
'TRSTSR'   'TTSRRS'   'RTTSRS' 

Group 4:   Group 9:  Group 14: 

'SRTRST'   'RSRSTT'   'RRSSTT' 
'SRTSTR'   'SSRTRT'   'SSRRTT' 
'RTSRST'   'STSTRR'   'SSTTRR' 
'TSRSTR'   'RRTSTS'   'RRTTSS' 
'RTSTRS'   'TRTRSS'   'TTRRSS' 
'TSRTRS'   'TTSRSR'   'TTSSRR' 

Group 5:   Group 10:  Group 15: 

'STRRST'   'SRSRTT'   'SRSTRT' 
'RSTTRS'   'SSTRTR'   'RSRTST' 
'SRTTSR'   'RRSTST'   'STSRTR' 
'RTSSRT'   'TSTSRR'   'RTRSTS' 
'TRSSTR'   'RTRTSS'   'TSTRSR' 
'TSRRTS'   'TTRSRS'   'TRTSRS' 

Мне нужно возвращать одну строку для каждой группы, Я предпочитаю строку с буквой R в качестве первой буквы. Извините за изменение нотации.

----- EDIT 1 -----

Я попытаюсь объяснить, почему

str1='RSTRST' 

и

str2='STRSTR' 

эквивалентны.

Вы должны рассмотреть «R» в str1 и заменить его на «S», заменить «S» на «T» и, наконец, «T» на «R». Все строки в группе правы, но в каждой группе все строки эквивалентны, и мне нужно взять только одну строку из каждой группы.

Как сказал стакан, правило замены персонажей не всегда работает, мне нужно найти правильную роль.

+2

Я действительно не вижу, какие перестановки вы хотите сохранить. Можете ли вы перечислить разрешенные перестановки 'aabbcc''? Или скажите нам правило, которое вы используете для получения перестановок? – beaker

+0

@beaker Я добавил несколько примеров, извините за изменение обозначений. –

+0

Я не понимаю смысл четырех групп. Для одного примера ввода вы можете дать все 15 перестановок, которые вы ожидаете? И некоторые примеры, которые не следует включать в причину (например, не включать ABC, поскольку CDE уже включен) – Daniel

ответ

1

Я думаю, теперь я понял код, это будет решить:

  • Использование uperm для создания набора все возможным решением.
  • Звоните [a]=unique(solution,'stable') на каждое решение, возвращаемое uperm, и принимайте его, только если возвращается RST (или любой фиксированный заказ).
+0

Спасибо, я пытаюсь использовать его, и я скажу вам что-то скоро. –

+0

Я пробовал, но думаю, что это не так. Попробуйте посмотреть группу 3, есть две строки, где 'unique (solution, 'stable')' return 'RST'. Наоборот, в группе 8 нет строк, возвращающих 'RST'. Возможно, нет видимых корреляций между строками, и я могу сгруппировать эти строки, только имитируя физическую проблему. @daniel –

+0

Я только что понял, что у меня было неправильное понимание ваших групп, потому что. Почему RSTSRT и RSTRTS одинаковы? Я бы ожидал их в разных группах. – Daniel