题解 第四章字符串| #后缀子串排序#
后缀子串排序
http://www.nowcoder.com/practice/f89f96ea3145418b8e6c3eb75773f65a
分析一下本题
能够很轻松得获得子串
可以用排序交换的方法来解决问题
也可以直接用c语言自带的qsort方法
要用qsort的话,就要动态分配内存来定义数组
并且尤其要注意内存的释放
最后就是用cpp的vector容器和sort函数的方法
法1:排序交换
//法1:排序交换
#include <stdio.h>
#include <string.h>
#define MAX 101
int main()
{
//用于存放本体和各子串
char Save[MAX][MAX]={0};
//将原本的串输入第一行
scanf("%s",Save[0]);
//记录串长,也即子串个数
int Length=strlen(Save[0]);
//将各个子串存入了这个大数组
for(int i=1;i<Length;i++)
strcpy(Save[i],Save[0]+i);
char TMP[MAX]={0};
//使用排序交换的方法
for(int i=0;i<Length-1;i++)
for(int j=i+1;j<Length;j++)
{
if(strcmp(Save[i],Save[j])>0)
{
strcpy(TMP,Save[i]);
strcpy(Save[i], Save[j]);
strcpy(Save[j],TMP);
}
}
//输出所有结果
for(int i=0;i<Length;i++)
printf("%s\n",Save[i]);
return 0;
}
法2:动态分配用qsort方法
注意qsort函数的cmp函数写法
在这里,要把这个void*类型的指针
强制类型转换成一个二阶指针类型,表明是指向指针的指针
然后,再进行取值,取到原本的指针值,也就相当于动态数组的数组名
即可使用strcmp函数了
//法2:动态数组qsort
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 101
int cmp(const void* a,const void* b)
{
return strcmp(*((char**)a),(*(char**)b));
}
int main()
{
//创建一个动态数组
char *SubString[MAX]={NULL};
SubString[0]=(char*)malloc(sizeof(char) * MAX);
scanf("%s",SubString[0]);
//这是串长,也是子串总个数
int Length=strlen(SubString[0]);
//接下来将所有的子串都存下来
for(int i=1;i<Length;i++)
{
//动态分配了内存
SubString[i]=(char*)malloc(sizeof(char) * MAX);
strcpy(SubString[i],SubString[0]+i);
}
//将SubString中所有的字符串都进行排序
qsort(SubString,Length,sizeof(char*),cmp);
//将所有子串输出
for(int i=0;i<Length;i++)
printf("%s\n",SubString[i]);
//一定要注意,将所有的动态分配的部分都释放
for(int i=0;i<Length;i++)
{
free(SubString[i]);
}
return 0;
}
法3:使用Cpp的vector和sort方法
王道机试指南刷题 文章被收录于专栏
计划刷完这本书