再论字典序
排列下一个字典序:
- 从原排列后部开始,对相邻一对进行比较,若前者小于后者,标记前者下标为 j;
- 令 k = len - 1, k 递减,寻找到 order[ K ] > order[ j ] (k > j) ,交换两项;
- 对 order[ j + 1 ] 到 order[ k ], 进行从小到大的排序就可以了。
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char order[60];
int main()
{
int len, i, j, k, ok;
char c;
while(scanf("%s",order)!=EOF)
{
if(order[0] == '#')
return 0;
len = strlen(order);
ok = 0;
for(i=1; i<len; i++)
if(order[i-1] < order[i])
{
ok = 1;
break;
}
if(!ok) printf("No Successor\n");
else
{
for(i = len-2; i >= 0; i--)
{
if(order[i] < order[i+1])
{
j = i;
for(k = len-1; k > j; k--)
{
if(order[k] > order[j])
{
c = order[k];
order[k] = order[j];
order[j] = c;
//***********************
sort(order+j+1,order+len);
//***********************
break;
}
}
break;
}
}
printf("%s\n",order);
}
}
return 0;
}
当然C++里对下一个字典排序是有STL的:
不过对于STL,我的观点是:用之前必须弄明白它的原理。
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int len;
char order[60];
while(scanf("%s", order) != EOF)
{
if(order[0] == '#') return 0;
len = strlen(order);
if(next_permutation(order,order+len)) printf("%s\n", order);
else printf("No Successor\n");
}
return 0;
}
http://acm.pku.edu.cn/JudgeOnline/problem?id=1256
the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'. (初始排列)
求全排列:
心得:
- 原先错误写地写成cmp()传进去的参数为数组下标(其实应该是字符型的),导致sort()不能正常工作,而且代码写的冗杂,通过一个exist()函数来判断是否存在下一个排列(其实只要通过next()函数的返回值判断就可以了)。sort()函数和exist()函数都要调用cmp()函数,于是没想清楚,参数选错。
- cmp()函数通过对两个参数的大小写的判断再进行比较。
cmp()
代码
bool cmp(char a, char b)
{
if(a >= 'A' && a <= 'Z' && b >= 'A' && b <= 'Z') return a < b;
if(a >= 'A' && a <= 'Z' && b >= 'a' && b <= 'z') return a+32 <= b;
if(a >= 'a' && a <= 'z' && b >= 'A' && b <= 'Z') return a < b+32;
if(a >= 'a' && a <= 'z' && b >= 'a' && b <= 'z') return a < b;
}
main()内输出部分:
sort(list, list+len, cmp);
while(1)
{
printf("%s\n", list);
if(!next()) break;
}
/**************************************************************************
                 
原文来自博客园——Submarinex的博客: www.cnblogs.com/submarinex/               
 
*************************************************************************/