学校资源网站的建设方案,友汇网站建设管理后台,小型软件外包公司,个人摄影网站源码最近遇到一道题目#xff1a;多组字符串匹配#xff0c;输出所有重复出现的字符串#xff0c;多次重复出现的只输出一次就好。
举个例子#xff1a;
input#xff1a;qwer qwer sdfgh
output#xff1a;qwer
题意大致就是这样#xff0c;下面给出我的最终解答#…最近遇到一道题目多组字符串匹配输出所有重复出现的字符串多次重复出现的只输出一次就好。
举个例子
inputqwer qwer sdfgh
outputqwer
题意大致就是这样下面给出我的最终解答因为不是OJ所以可能还会有些许错误若有还望各位指正
一、解题思路
1、main函数里
因为涉及到多组字符串匹配为了方便起见我是用二维数组开的足够大而且是有两个一个用来存储初次输入的字符串另一个用来保存要输出的结果以便统一输出存储字符串并进行比较你可以尝试一下动态分配内存空间malloc一下。我先输入一个数字用来明确将要有多少串字符串进行匹配。接下来根据之前输入的数字进行字符串的输入输入完成后就会跳进字符串匹配函数match中。
2、match字符串匹配函数
这部分函数写的很复杂-空间复杂度高循环套循环循环套循环因为不是OJ所以这么任性这个函数大体上实现两个功能1匹配字符串将重复出现的字符串有条件的放到str1[1000][1000]数组中
2对已重复出现的字符串进行查重即“1”中的存储条件以达到单一输出的目的
match内部使用的函数是函数库中提供的strcmp函数和strcpy函数。值得注意的是在将已查到的重复的字符串放入str1[1000][1000]数组输出结果聚集数组中时有一个Flag标记用来标明这个将要存储的字符串是否已在str1[1000][1000]数组存在。
二、实现过程
下面的程序将main和match函数分离代码的注释应该是很清楚了所以在这里就不多说了程序中涉及到二维数组传参问题等可以参考我的其他博文strcmp()可以比较二维数组但是是要按行来比较
#includestdio.h
#includestring.h
char str[1000][1000]; //定义一个能存1000个字符串的大小为1000个字符的char型数组
char str1[1000][1000];//把所有找到的不重复的结果存储找到STR1中
int k0;//str1中的字符串数量
void match(int n,char (*str)[1000])
{int i,p;//定义内外循环变量int j0;//循环控制变量判断找到的在str中重复出现的字符串之前是否存到了str1中。for(i0; in-1; i){for(pi1; pn; p){if(strcmp(str[i],str[p])0)//说明str字符串组中有重复出现的字符串{if(k0)//表示str1中还没有字符串所以可以直接复制过去{strcpy(str[p],str1[k]);k;}else{int flag0;//用于确定str中重复出现的字符串是否在str1中出现for(j0;jk;j)//用循环对已找出的str1中进行查重{if(strcmp(str[p],str1[j])0)//如果有重复则改变标记flag{flag1;break;}elsecontinue;}//跳出循环后对flag进行判断如果为0说明可以将之前的结果放入str1中若为1则说明结果重复进行下一次的str字符串组的搜寻if(flag0){strcpy(str[p],str1[k]);k;}elsecontinue;}}}}
}
int main()
{printf(请输入要比对的字符串数量\n);int n;//字符串数量scanf(%d,n);//输入字符串的数量printf(请输入所有要比对的字符串\n);for(int i0; in; i) //循环从而输入所有要匹配的字符串。scanf(%s,str[i]);match(n,str);//调用匹配函数int i0;if(k!0)//说明有结果可以输出{printf(所有重复出现的字符串为\n);for(i0;ik;i)printf(%s\n,str[i]);}elseprintf(抱歉没有相同的字符串\n);return 0;
}