九度OJ 1099:后缀子串排序 (排序)
- 题目描述:
-
对于一个字符串,将其后缀子串进行排序,例如grain
其子串有:
grain
rain
ain
in
n然后对各子串按字典顺序排序,即:
ain,grain,in,n,rain
- 输入:
-
每个案例为一行字符串。
- 输出:
-
将子串排序输出
- 样例输入:
-
grain
- 样例输出:
-
ain grain in n rain
思路:
可以将字符串分解后拷贝到一个字符串数组中,然后快速排序。
但拷贝过程实际上可以避免,考虑设置一个指针数组,分别指向字符串的不同位置,对指针数组进行排序即可。
该题对时间要求不高,暂时并未实现后一种方法。
代码:
#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 ****************************************************************/
编程算法爱好者。