您的位置:首页 > 编程语言 > C语言/C++

黑马程序员-c语言-字符串求公共子类

2015-08-21 23:32 399 查看
------- 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培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: