题解 第四章字符串| #后缀子串排序#

后缀子串排序

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方法

王道机试指南刷题 文章被收录于专栏

计划刷完这本书

全部评论

相关推荐

5 收藏 评论
分享
牛客网
牛客企业服务