最近遇到一道题目:多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。
举个例子:
input:qwer
qwer
sdfgh
output:qwer
题意大致就是这样,下面给出我的最终解答,因为不是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()可以比较二维数组,但是是要按行来比较)
#include<stdio.h>
#include<string.h>
char str[1000][1000]; //定义一个能存1000个字符串的大小为1000个字符的char型数组
char str1[1000][1000];//把所有找到的不重复的结果存储找到STR1中
int k=0;//str1中的字符串数量
void match(int n,char (*str)[1000])
{int i,p;//定义内外循环变量int j=0;//循环控制变量,判断找到的在str中重复出现的字符串之前是否存到了str1中。for(i=0; i<n-1; i++){for(p=i+1; p<n; p++){if(strcmp(str[i],str[p])==0)//说明str字符串组中有重复出现的字符串{if(k==0)//表示str1中还没有字符串,所以可以直接复制过去{strcpy(str[p],str1[k]);k++;}else{int flag=0;//用于确定str中重复出现的字符串是否在str1中出现for(j=0;j<k;j++)//用循环对已找出的str1中进行查重{if(strcmp(str[p],str1[j])==0)//如果有重复,则改变标记flag{flag=1;break;}elsecontinue;}//跳出循环后,对flag进行判断,如果为0说明可以将之前的结果放入str1中,若为1,则说明结果重复,进行下一次的str字符串组的搜寻if(flag==0){strcpy(str[p],str1[k]);k++;}elsecontinue;}}}}
}
int main()
{printf("请输入要比对的字符串数量:\n");int n;//字符串数量scanf("%d",&n);//输入字符串的数量printf("请输入所有要比对的字符串:\n");for(int i=0; i<n; i++) //循环,从而输入所有要匹配的字符串。scanf("%s",&str[i]);match(n,str);//调用匹配函数int i=0;if(k!=0)//说明有结果可以输出{printf("所有重复出现的字符串为:\n");for(i=0;i<k;i++)printf("%s\n",str[i]);}elseprintf("抱歉!没有相同的字符串\n");return 0;
}