У меня есть этот код для создания лексикографических перестановок. Используется следующая логика:
- Начните с расположения символов в порядке возрастания в заданной тестовой строке.
- Чтобы сгенерировать следующую лексикографическую перестановку:
а) найти самый правый символ, который меньше следующего за ним символа. СКАЖИ А.
б) справа от A найти следующий больший символ. СКАЖИТЕ Б. и поменяйте местами А и Б.
в) справа от исходной позиции A отсортировать символы по возрастанию.
Алгоритм заканчивается, когда мы получаем последнюю перестановку. то есть реверс данной тестовой строки. моя тестовая строка s = "0123456789"
Изменить: При каждом запуске программы я получаю отдельную позицию ошибки сегментации.
чтобы получить:
int firstchar(string s){
int pos = s.length()-2;
for(int i=pos;i>=0;i--){
if(s[i]<s[i+1]){
pos = i;
break;
}
}
return pos;}
чтобы получить B, а затем рекурсивный подход (qsort - это функция из <cstdlib>
):
int ceilchar(string s, int fc){
int ceil = fc+1;
int diff=27;
for(int i=ceil;i<s.length();i++){
if(s[i]>s[fc] && s[i]-s[fc]<diff){
ceil = i;
diff = s[i]-s[fc];
}
}
return ceil;}
пусковая функция:
void nextpermute(string& s){
int fc = firstchar(s);
int cc = ceilchar(s,fc);
swap(s,fc,cc);
sort(&s[fc]+1,&s[fc]+s.length()-fc);
if(s!="9876543210"){
cout<<s<<"\n";
nextpermute(s);
}
else
cout<<s<<"\n";}
вызов с основного: nextpermute(test);
Если тестовая строка "01234567"
или что-то меньше этого, она работает хорошо. но если это строка типа "012345678"
или "0123456789"
, то я получаю ошибки сегментации. Пожалуйста помоги!!
std::next_permutation
? - person chris   schedule 10.08.2013strcmp
сs.c_str()
вместоoperator==
сs
? Вам удалось взять безопасный код и сделать его небезопасным. - person chris   schedule 10.08.2013qsort
,strlen
иstrcmp
используйтеstd::sort
и функции-членыstd::string
- person TemplateRex   schedule 10.08.2013std::sort()
форму<algorithm>
вместоqsort()
. - person   schedule 10.08.2013