九度OJ 1099:后缀子串排序 (排序)

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:3439

解决:1491

题目描述:

对于一个字符串,将其后缀子串进行排序,例如grain
其子串有:
grain 
rain 
ain 
in 
n

然后对各子串按字典顺序排序,即: 
ain,grain,in,n,rain

输入:

每个案例为一行字符串。

输出:

将子串排序输出

样例输入:
grain
样例输出:
ain
grain
in
n
rain
来源:
2010年上海交通大学计算机研究生机试真题

思路:

可以将字符串分解后拷贝到一个字符串数组中,然后快速排序。

但拷贝过程实际上可以避免,考虑设置一个指针数组,分别指向字符串的不同位置,对指针数组进行排序即可。

该题对时间要求不高,暂时并未实现后一种方法。


代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define N 1000
 
int cmp(const void *a, const void *b)
{
    return strcmp((char *)a, (char *)b);
}
 
int main(void)
{
    int i, j, k, n;
    char s[N][N];
 
    while (scanf("%s", s[0]) != EOF)
    {
        n = strlen(s[0]);
        for(i=1; s[0][i]; i++)
        {
            k = 0;
            for(j=i; s[0][j]; j++)
                s[i][k++] = s[0][j];
            s[i][k] = '\0';
        }
        qsort(s, n, sizeof(s[0]), cmp);
        for(i=0; i<n; i++)
            printf("%s\n", s[i]);
    }
 
    return 0;
}
/**************************************************************
    Problem: 1099
    User: liangrx06
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:1824 kb
****************************************************************/


posted on 2015-10-23 09:24  梁山伯  阅读(829)  评论(0编辑  收藏  举报

导航