c语言查找并输出重复字符串
要求:在一大串无序字符串中,查找所有重复的字符串,注意是所有!并输出所有这些字符串和重复的个数。无序字符串个数可能在1000以上。重复的单字符不算在内。举例:abc124...
要求:在一大串无序字符串中,查找所有重复的字符串,注意是所有!并输出所有这些字符串和重复的个数。无序字符串个数可能在1000以上。重复的单字符不算在内。
举例:abc1243128129a343abc
则要输出:
abc 2(ab,bc不用再输出)
12 3
43 2
我的财富不多,但求来个真正的大神!
我想了很久都没想出来!
给出整篇代码(加注释),我会验证的! 展开
举例:abc1243128129a343abc
则要输出:
abc 2(ab,bc不用再输出)
12 3
43 2
我的财富不多,但求来个真正的大神!
我想了很久都没想出来!
给出整篇代码(加注释),我会验证的! 展开
1个回答
展开全部
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
void stringsort(char(*p)[1000], int m) // 排列字符串,长的字符串在前面,短的在后面。
{
int i, j;
char c[1024];
for (i = 0; i < m-1; i++)
{
for (j = 0; j < m - 1 - i; j++)
if (strlen(p[j]) < strlen(p[j + 1]))
{
strcpy(c, p[j]);
strcpy(p[j], p[j + 1]);
strcpy(p[j + 1], c);
}
}
}
int substr(char *str, char *p) //判断 p是否是str的字串,是的话返回1,不是返回0
{
int i, j;
for (i = 0; str[i]; i++)
{
for (j = 0; str[i] == p[j] && p[j]; i++, j++);
if (p[j] == 0)
{
return 1;
}
if (j != 0)
{
i--;
}
}
return 0;
}
int main(void)
{
char str[1000] = "abc1243128129a343abc";
char ss[1024] = {0}; //放子串的临时数组
char ss1[1000][1000]; //所有长度大于1的子串放入这里
int m = 0; //子串的个数
int a[1024] = { 0 }; //统计子串的个数的数组
int i, j;
for ( i = 0; str[i]; i++)
{
memset(ss, 0, 1024);
int k = 0;
ss[k++] = str[i];
for ( j = i + 1; str[j]; j++)
{
ss[k++] = str[j];
strcpy(ss1[m++], ss);
}
}
//上面这段程序是找出字符串长度大于1的所有子串
stringsort(ss1, m); //把这些字串按长度放入ss1中,长的在前面,短的在后面
for ( i = 0; i < m; i++)
{
char *p =str;
while ((p = strstr(p, ss1[i])) != NULL)
{
a[i] ++;
p = p + strlen(ss1[i]);
}
}// 这段程序是找到每一个子串出现的次数,并放入a数组中
for ( i = 0; i < m; i++)
{
int flag = 0; //标记符
for ( j = 0; j < i; j++)
{
if (substr(ss1[j], ss1[i]) && a[j]==a[i]) //比如abc出现了三次,而bc出现三次,那么只输出abc的次数
{
flag = 1;
}
}
if (a[i]>1 && flag == 0)
printf("%s:%d\n", ss1[i], a[i]);
}
//system("pause");
return 0;
}
//写了一晚上,真是不容易啊
更多追问追答
追问
你的程序不行。我随便测试了一个字符串:
americawehavecomesofarwehaveseensomuchbutthereissomuchmoretodosotonightletusaskourselves(88个)程序就崩溃了。在vc++6.0和vs2015上都是这样。
有的时候没崩溃但却不能输出。
你的程序对大点的字符串没有作用。
再改改吧......
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询