黑马程序员-c语言-字符串求公共子类
2015-08-21 23:32
399 查看
------- android培训、java培训、期待与您交流!
----------
tip:之所以想把这个小程序写下来,是因为编程的时候发了很长时间。整体感觉代码不简洁,不过,码出来时还是很开心。
找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
------- android培训、java培训、期待与您交流!
----------
----------
tip:之所以想把这个小程序写下来,是因为编程的时候发了很长时间。整体感觉代码不简洁,不过,码出来时还是很开心。
找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
#include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) { // insert code here... printf("请输入 字符串个数\n"); int num; scanf("%d",&num); char c = getchar(); char str[num][50]; memset(str,0,50*num); unsigned long minlen=50; int minPlace =0;//存放位置,即最短的在所输入的几个字符串中的位置 int comparePlace=0; char minStr[50];//存放长度最短的字符串 memset(minStr,0,50); //start of input str,并记录最短的字符串 for(int i=0;i<num;i++){ printf(" 请输入第%d个字符",i+1); scanf("%s",str[i]); c = getchar(); unsigned long len = strlen(str[i]); if(minlen>len){ minlen = len; minPlace = i; strcpy(minStr,str[i]); } printf("%s",str[i]); } printf("最短的字符为%s\n",minStr); // end of input char subAry[50][50]; memset(subAry,0,2500); int subNum=0; ///////////////////////////// for(unsigned long i=0;i<minlen;i++){ unsigned long pstart = i; unsigned long pcursor =i; char temp[50]; memset(temp,0,50); if(minPlace!=0){ strcpy(temp,str[0]); comparePlace =0; }else{ strcpy(temp,str[1]); comparePlace=1; } //用最短的和第一个求子串,如果第一个是最小的,就第一个和第二个求子串 for(unsigned long j=0;j<strlen(temp)-i;j++){ unsigned long ptmp= j; if(minStr[pstart] == temp[j]){ int subchildnum=0; while(temp[ptmp] == minStr[pcursor]){ subAry[subNum][subchildnum]=minStr[pcursor]; subchildnum++; ptmp++; pcursor++; } subAry[subNum][subchildnum]='\0'; subNum++; } }//end of 求子串 } ///////////////////////////////// //对由最短字符串和第一个或者第二个字符串所求的子串(不全的。因为俩字符串 abcdfh 和 abcfgh ,上面的代码能求出 abc,f,h是子串,其实 a,b,c,也是子串。只是对这题注重最大,所以不影响。)公共子串,对所有给出的字符串遍历,看是否包含,如果都包含,则与maxsubstr比较,如果长,则更换maxsublen值 unsigned long maxsublen=0; char maxsubstr[50]; memset(maxsubstr,0,50); for(int i=0;i<subNum;i++){ int thissubnum=2; for(int j=0;j<num;j++){ if(j==minPlace||j==comparePlace){ continue; }else{ if(!strstr(str[j],subAry[i])){ break; }else{ thissubnum++; } } } if((thissubnum == num)&&(strlen(subAry[i])>maxsublen)){ maxsublen=strlen(subAry[i]); strcpy(maxsubstr,subAry[i]);//更改maxsublen值。 // maxsubstr=subAry[i]; } } printf("最长的子串为 %s\n",maxsubstr); }
------- android培训、java培训、期待与您交流!
----------
相关文章推荐
- C语言字符数组与字符串简介
- C++ 函数返回引用
- c++ 模板函数,类模板,仿函数使用实例代码
- 同一个变量打印char类型和unsigned char 类型,引发的思考
- 关于argc和argv
- 【C++】万年历(时间计数器)
- C语言中二维数组的动态申请与释放
- 【C++】复数类
- The hardest problem
- C++ 中单独的下划线_是合法的标识符
- [LeetCode] Ugly Number II
- c++程序设计课程--简单的设计任务
- Biker's Trip Odomete
- C语言变量声明内存分配
- 经典任务调度算法的模拟程序
- 零基础学C语言 笔记二 scanf
- C++ 中左值与右值区别
- C/C++浮点数在内存中的存储方式
- c语言之进制转换(栈实现)
- [C++11 并发编程] 08 - Mutex std::unique_lock