东华OJ基础题79 子字符串排序

问题描述 :
编程对字符串中的子串按字典序输出。子串的形成方法为:从原始字符串开始,依次去掉开头字符形成新的子串。
例如,字符串"grain" 的子串如下所示(依次去掉g,r,a,i):
grain、rain、ain、in、n
按字典序排列为:
ain
grain
in
n
rain

输入说明 :
输入有多行,每行一个字符串,每个字符串的长度大于0小于等于10,字符串中不包含空格。

输出说明 :
对每个字符串,按字典序输出所有子串。
行首与行尾不包含多余空格,也不包含多余空行。
输入范例 :
grain
123cba
输出范例
ain
grain
in
n
rain
123cba
23cba
3cba
a
ba
cba
总结
1.这个题真棒!“从原始字符串开始,依次去掉开头字符形成新的子串”,就这个已经有点小难度了,这里使用了指针数组,对,指针数组。
我特意试了代码:在这里插入图片描述
上述代码包含的知识点丰富:指针数组的声明、动态分配、巧妙利用指针的加加特性赋值
2.两个字符串比较大小不能简单像数值型比较大小。用函数strcmp(字符串1,字符串2),
3.字符串排序跟字符排序,数值型排序一样,我这里还是选我比较熟悉的直接插入排序,只要比较大小的时候注意用2里面的函数就可以了。
代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void sort(char *str[],int n);
int main(){
	int i,len;
	char *p[11],str[11];												
	while(gets(str)){			//从原始字符串开始,依次去掉开头字符形成新的子串			
	len=strlen(str);		//根据所输入字符串的大小设置指针数组来保存
	for(i=0;i<len;i++){
		p[i]=(char *)malloc(sizeof(char)*(len-i));
		strcpy(p[i],str+i);
	}
	sort(p,len);
	for(i=0;i<len;i++)
		puts(p[i]);
	}
	return 0;
}
//直接插入排序
void sort(char *str[],int n){
	int i,j;
	char *p;
	for(i=1;i<n;i++){
		if(strcmp(str[i-1],str[i])>0){
			p=str[i];
		for(j=i-1;j>=0 && strcmp(str[j],p)>0;j-- ){
				str[j+1]=str[j];
			}
			str[j+1]=p;
		}
	}		

}


发布了16 篇原创文章 · 获赞 1 · 访问量 113

猜你喜欢

转载自blog.csdn.net/weixin_44205451/article/details/104597260