user-0 提问: c语言的问题重复字符串

回复:
user: user-1
content: C语言水平有限，写的比较啰嗦，请指点。不过，以下代码各种情况考虑的还算完整吧。 从最大可能的长度->0进行检索。(同一字符串可能存在多个(>=3)，或者在同一长度不同数据的字符串存在相同的) #include <stdio.h> #include <string.h> #include <malloc.h>  int printf_same(char *p, int start, int len) { 	int i,l; 	char *tmp;  	l = strlen(p); 	tmp=malloc(l); 	tmp=strncpy(tmp,p,l);  	for(i=0; i<l; i++){ 		if((i>=start) && (i<(start+len))){ 			printf("%c", *tmp); 		}else{ 			printf(" "); 		} 		tmp++; 	} 	tmp = tmp-i; 	printf("\n");  	free(tmp); 	return 0; }  int main() { 	char *a = "abcdefabbcdfabbcdfabbcddafdsafsadffabbcdjakmddddddddddmszfabbcdfabbcdzlfabbcdfxfabbcdfabbcdxmddddddddddmxj"; 	int i,j,k,len; 	int flag=0; 	char *b; 	int tmp1=0;  	len = strlen(a); 	b=malloc(len); 	b=strncpy(b,a,len); 	printf("%s\n",a);  	for(i=len-1; i>0; i--){ 		for(j=0; j<(len-i); j++){ 			for(k=0; k<=(len-i); k++){ 				if(k == j){ 					continue; 				} 				a = a+j; 				b = b+k; 				if(strncmp(a,b,i) == 0){ 					a = a-j; 					b = b-k; 					if(k < j){ 						break; 					}  					if(tmp1 != j){ 						tmp1=j; 						flag=0; 					}  					if((flag == 0)){ 						printf("same length is : %d\n", i); 						printf_same(a, j, i); 						flag = 1; 					} 					printf_same(a, k, i); 				}else{ 					a = a-j; 					b = b-k; 				} 			} 		} 		if(flag == 1){ 			break; 		} 	}  	free(b); 	return 0; }   试验的结果是： [root@weihao01-vm samestring]# ./samestring.o  abcdefabbcdfabbcdfabbcddafdsafsadffabbcdjakmddddddddddmszfabbcdfabbcdzlfabbcdfxfabbcdfabbcdxmddddddddddmxj same length is : 12      fabbcdfabbcd                                                                                                     fabbcdfabbcd                                                                                                                                             fabbcdfabbcd                                                                                                                     fabbcdfabbcd                same length is : 12                                            mddddddddddm                                                                                                                                                mddddddddddm   [root@weihao01-vm samestring]#

user: user-2
content: 引用 10 楼 u014161864 的回复:[quote=引用 9 楼 SXJIAKE 的回复:] [quote=引用 3 楼 u014161864 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  膜拜论坛大牛！[/quote] 膜拜个鸟，这个例子没一点水平，会 C 的谁不会写。输入一个长串后要求把这个串中重复出现的最长字符串打出来，具体的重复内容和长度根本就是未知的。[/quote]  角度不一样。。你可以去看看这位大牛是不是在每个帖子里面都能发现他的魅影？！[/quote]  对于这种大牛，我只说一句话：希望这种人多多益善！！大大有利于人类进步，并向他致以敬意。

user: user-3
content: 怎么感觉像字典压缩算法。

user: user-4
content: 引用 9 楼 SXJIAKE 的回复:[quote=引用 3 楼 u014161864 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  膜拜论坛大牛！[/quote] 膜拜个鸟，这个例子没一点水平，会 C 的谁不会写。输入一个长串后要求把这个串中重复出现的最长字符串打出来，具体的重复内容和长度根本就是未知的。[/quote]  角度不一样。。你可以去看看这位大牛是不是在每个帖子里面都能发现他的魅影？！

user: user-5
content: 引用 3 楼 u014161864 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  膜拜论坛大牛！[/quote] 膜拜个鸟，这个例子没一点水平，会 C 的谁不会写。输入一个长串后要求把这个串中重复出现的最长字符串打出来，具体的重复内容和长度根本就是未知的。

user: user-6
content: for(i=wz;i<cd;i++)       printf("%c",zifu[i]); fflush(stdout);或printf("\n");

user: user-2
content: 引用 6 楼 wenpinglaoyao 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   请教赵老师，这是按楼主意思写的代码，可为什么却出现最后一个for循环不打印任何字符【竟然还能运行不报错！】这种奇怪现象？？下面是代码和运行结果图片： #include "stdio.h" char zifu[100]; void main() {     int a,b,d,e,i,j;     int cd=0,wz=0,temp;     char c;          for(i=0;i<100&&(c=getchar())!='\n';i++)       zifu[i]=c;          for(a=0;a<i;a++)     {     	for(b=a+1;b<i;b++)     	{     		if(zifu[a]==zifu[b])     		{     			for(d=a+1,e=b+1,temp=1;zifu[d]==zifu[e];d++,e++,temp++);     			if(temp>cd)     			{     				cd=temp;     				wz=a;     			}     		}     	}     }          printf("最长字符为%d\n",cd);     printf("它的位置在%d\n",wz);     for(i=wz;i<cd;i++)       printf("%c",zifu[i]);      } [/quote]   引用 6 楼 wenpinglaoyao 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   请教赵老师，这是按楼主意思写的代码，可为什么却出现最后一个for循环不打印任何字符【竟然还能运行不报错！】这种奇怪现象？？下面是代码和运行结果图片： #include "stdio.h" char zifu[100]; void main() {     int a,b,d,e,i,j;     int cd=0,wz=0,temp;     char c;          for(i=0;i<100&&(c=getchar())!='\n';i++)       zifu[i]=c;          for(a=0;a<i;a++)     {     	for(b=a+1;b<i;b++)     	{     		if(zifu[a]==zifu[b])     		{     			for(d=a+1,e=b+1,temp=1;zifu[d]==zifu[e];d++,e++,temp++);     			if(temp>cd)     			{     				cd=temp;     				wz=a;     			}     		}     	}     }          printf("最长字符为%d\n",cd);     printf("它的位置在%d\n",wz);     for(i=wz;i<cd;i++)       printf("%c",zifu[i]);      } [/quote]  哦懂了，真是献丑了。是自己代码有问题，之所以不报错是因为根本无措可报【循环不运行】

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   请教赵老师，这是按楼主意思写的代码，可为什么却出现最后一个for循环不打印任何字符【竟然还能运行不报错！】这种奇怪现象？？下面是代码和运行结果图片： #include "stdio.h" char zifu[100]; void main() {     int a,b,d,e,i,j;     int cd=0,wz=0,temp;     char c;          for(i=0;i<100&&(c=getchar())!='\n';i++)       zifu[i]=c;          for(a=0;a<i;a++)     {     	for(b=a+1;b<i;b++)     	{     		if(zifu[a]==zifu[b])     		{     			for(d=a+1,e=b+1,temp=1;zifu[d]==zifu[e];d++,e++,temp++);     			if(temp>cd)     			{     				cd=temp;     				wz=a;     			}     		}     	}     }          printf("最长字符为%d\n",cd);     printf("它的位置在%d\n",wz);     for(i=wz;i<cd;i++)       printf("%c",zifu[i]);      }

user: user-7
content: 没有复杂度限制，那就直接四次方，枚举子串，然后判断每个子串出现了多少次。 要快的，后缀树，nlogn建树，然后直接统计后缀树里频度最高的节点就行。

user: user-8
content: 引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  恕我愚笨，没看出怎么计算结果，还望大神指点

user: user-4
content: 引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   膜拜论坛大牛！

user: user-6
content: 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }