最近遇到一道題目:多組字符串匹配,輸出所有重復出現的字符串,多次重復出現的只輸出一次就好。
舉個例子:
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;
}