Помогите со строкой

Статус
Закрыто для дальнейших ответов.

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
Есть строка $str, нужно получить все возможные комбинации строк из символов, которые используются в этой строке. Учитывая то, что символы не повторяются.

Например, строка $str = "ab", тогда результатом будет:

aa
ab
ba
bb

Можно задавать длину строки, то есть, если нужно получить комбинации по 3 символа, результат должен быть таким:

aaa
aab
aba
abb
baa
bab
abb
bbb


Как вы заметили, количество комбинаций всегда будет равняться количеству символов в строке вознесенную в степень количества символов получаемых комбинаций. То есть, в первом случай это было 2 в степени 2, а во втором - 2 в степени 3.
 

v0rbis

selfcoded
Регистрация
02.05.2005
Сообщения
923
в тервере это называется сочетанием. и это известно каждому студенту первого класса =)
 

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
Что еще за тервер? :) И что еще за студенты класса? :)
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
тервер-Теория Вероятности

Как я помню, мы это проходили классе в 8-9 примерно.
Там была какая-то формула с фактериалом, может она подойдёт сосчитать кол-во вариантов, а алгоритм выбора букв можно сделать при помощи перебора.
типа создаём массив. И будем создавать переменные, если небыло заносим, если была, то пропускаем, и так пока длина массива не сровняется с кол-вом вариантов!
Вот моя идея. Правда если букв много и кол-во допустимых символов много, это займёт много времени.
Может придумаешьчто-то.
 

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
Я извиняюсь конечно, но вариант ни в какие ворота не лезет!
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Я не про тервер имел ввиду, а про сочетание.
Ладно пооффтопил и ладно....

m! - m фактериал
Вот формулы
1. Число всевозможных перестановок из 'm' элементов может быть найдено по формуле:
P=m(m-1)(m-2)(m-3)*...*2*1=m!
2.Число всевозможных сочетаний из m элементов по n может быть найдено по формуле:
С=[m(m-1)(m-2)*...*(m-n+1)]/1*2*3*...*n=m!/[n!(m-n)!]

Тебе помоему подойдёт первый вариант.

Вот сам скрипт кол-ва сочетаний

Код:
<?
global $c;
$c=3;

   function fakterial($c)  
	{
	 $b=$c;
	  for($i=$c-1;$i>0;$i--)
	   {
		$b=$b*$i;

	   }
	  echo $b;//Печатаем число сочетаний
	}


fakterial($c);

?>
А остальное подумай сам! :rolleyes:
Там уже посложнее.

Насчёт варианта ты прав. Извиняюсь!
Ещё подумаю
 

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
ЛОЛ :)))))))))))


Как узнать количество сочетаний я написал еще в первом посте, вместе с вопросом)))) Мне нужно узнать именно то, о чем ты написал "А остальное подумай сам! " :))
 

deMone

Злой страшный дядька
Регистрация
30.01.2006
Сообщения
937
Ну вот и подумайте. Не так уж это всё и сложно. Напрягите мозги.
 

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
Ребята, вы все супер просто :))

Вопросик почитали и все сошлись на мысле, что нужно подумать, причем задача на столько простая, что вы оставляете ее мне :)

Я вооще не понимаю смысл постов типа: "ой, да это совсем не сложно!" или "подумай сам".

У меня проблема, я поднял вопрос, кто не знает - не отписывайтесь. Всё
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
Ребята, это же простой алгоритм брута :) Лениво писать, но фишка в том: вы делаете соответствие массива: a = 0 b= 1 и т.д. кол-во символов - это ваша система счисления. после пишем цикл от 1 до n, как рассчитать n вам написали. в нем делается преобразование из десятичной сс в вашу, алгоритмы преобразования легко найти например здесь: http://www.onu.edu.ua/ua/pub/aovt.html#13.
во время деления замещаете получившиеся остатки нашими соответствиями. ВСЕ.
 

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
Я вроде как понял, о чем ты пишешь, только слабо верится в перебор всех сочетаний в один цикл от одного до n. Если опишешь алгоритм программно, буду очень благодарен))
 

v0rbis

selfcoded
Регистрация
02.05.2005
Сообщения
923
цикл от i = 0 до n.

бегаем в нем и переводим i в _двоичную_ систему. получется

0 - 000
1 - 001
2 - 010
3 - 011

и так далее... потом делаем соответствия дабы перейти к символам.

_upd_

хотя наерное лучше действительно брать за основание количество букв в строке
 

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
Возможно в этом что-то есть, но мне не очень понятно, как это реализовать...
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
i - минимальное вида aaa, т.е. 111 в нашей сс, s - система счисления
array - массив соответствий
string = ''
от i до n делать
{
r = i
пока r>s
{
r = целочисленное деление (r/s)
string .= array[остаток(r/s)]
}
string.= array[r]
arraystring = string
i = i+1
}
 

NAR

New Member
Регистрация
16.03.2007
Сообщения
7
Смотри на сайте www.prgmm.org статьи книги скрипты,
не хочу писать скрипт, тебе просто надо несколько циклов и массив символов присутствующих в сочитание. Сравниваешь записываешь все просто
 
Статус
Закрыто для дальнейших ответов.
Верх Низ