首页 > 代码库 > sdustoj 规范序排列

sdustoj 规范序排列

Description

规范序是一种对字符串比较的排序规则,定义如下:

1 串长小的排在前面;
2 相同串长的按照字典序排列顺序。

串的字典序遵循如下递归定义:

1 两串的前n-1个字符相同,第n个字符字典序小的排在前面;
2 只有两串的字符完全相同时,才有两串相等。

字符的字典序即按照字母排列的顺序,即a, b, ..., z。ASCII码范围内的字符串的字典序比较可以用strcmp()函数(原型和功能见HINT)完成。

Input

第一行输入为一个整数N(N<=100),后接N行,每行一个字符串。每个字符串仅由小写字母“a”~“z”组成,长度不超过10个字符。

Output

输出为N行,按照字符串的规范序排列,规范序小的排前面。

Sample Input

10
abc
bc
aca
ca
c
aac
aba
bc
da
ba

Sample Output

c
ba
bc
bc
ca
da
aac
aba
abc
aca

HINT

原型: int strcmp(const char *s1,const char * s2);

功能:比较字符串s1和s2。

  当s1<s2时,返回值<0

  当s1==s2时,返回值=0

  当s1>s2时,返回值>0
 
 
 
 
 
 
 
 
 
 
在拿到题目的瞬间,自己就暗示自己不会做,其实想想就是一个简单的排序。
代码如下:
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<ctype.h>
 4 int main()
 5 {
 6     int m;
 7     scanf("%d",&m);
 8     getchar();
 9     char a[100][100]={0};
10     int i;
11     for(i=0;i<m;i++)
12         gets(a[i]);
13     int j;
14     int x,y;
15     char s[110]={0};
16     for(i=0;i<m;i++)
17         for(j=0;j<m-i;j++)
18     {
19         x=strlen(a[j]);
20         y=strlen(a[j+1]);
21         if(x>y)
22         {
23             strcpy(s,a[j]);
24             strcpy(a[j],a[j+1]);
25             strcpy(a[j+1],s);
26         }
27         else if(x==y)
28         {
29             if(strcmp(a[j],a[j+1])>0)
30             {
31                 strcpy(s,a[j]);
32             strcpy(a[j],a[j+1]);
33             strcpy(a[j+1],s);
34             }
35         }
36     }
37     for(i=0;i<m;i++)
38         printf("%s\n",a[i]);
39 return 0;
40 }

不能用数组存储字符串的长度,因为在进行字符串交换时,数组中存储的长度并没有交换。

sdustoj 规范序排列