第一种:char 二维数组存储字符串进行去重与比较,复杂度较高。
#include <bits/stdc++.h> using namespace std; char a[10005][12]; char a1[10005][12]; char b[10005][12]; char b1[10005][12]; /*string类不能与char类进行strcmp,都用char就行了 char 二位输出字符串操作:1.字符串赋值,strcpy(s1,s2) 2.字符串比较,strcmp(s1,s2),相等retrun 0,不同return 1 3.小写转换大写:char 'a'-32; */ int main() { int n,m;cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i];//默认以空格中止输入与输出 //把所有小写字母转换成大写 for(int j=0;j<=11;j++) { if(a[i][j]>='a'&&a[i][j]<='z') { a[i][j]=a[i][j]-32; } } } for(int i=1;i<=m;i++) { cin>>b[i]; //把所有小写字母转换成大写 for(int j=0;j<=11;j++) { if(b[i][j]>='a'&&b[i][j]<='z') { b[i][j]=b[i][j]-32; } } } int l=1;int c1,c2;//记录去重后数组内单词个数 c1=0;c2=0; for(int i=1;i<=n;i++)//去重 { char s[12];strcpy(s,a[i]); int t=0; for(int j=1;j<=n;j++) { if(!strcmp(s,a1[j])) { t++; } } if(t==0) { strcpy(a1[l],s);l++; } } c1=l-1; l=1; for(int i=1;i<=m;i++)//去重 { char s[12];strcpy(s,b[i]); int t=0; for(int j=1;j<=m;j++) { if(!strcmp(s,b1[j])) { t++; } } if(t==0) { strcpy(b1[l],s);l++; } } c2=l-1;int ans1,ans2;//表示多少个不同的单词同时出现在两篇文章中与两篇文章一共包含了多少个不同的单词。 ans1=0;ans2=0; //ans1=c1+c2-ans1; for(int i=1;i<=c1;i++) { for(int j=1;j<=c2;j++) { if(!strcmp(a1[i],b1[j])) { ans1++; } } } ans2=c1+c2-ans1; cout<<ans1<<endl<<ans2<<endl; return 0; }
第二种:利用STL—set容器实现。参考:C++STL之Set容器 - 数据结构教程 - C语言网
思路:分别存储作品1的所以不同元素的set()与作品2的,则总不重复单词个数为二者set的size之和,二者set()再合并便为AUB元素集合,A∩B就是总单词个数-AUB元素集合size
#include <bits/stdc++.h> using namespace std; string a[10005]; string b[10005]; set<string> w1; set<string> w2; set<string> combine;//存a,b都不同的单词,就是AUB,去重的并集 //利用STLSet容器计算 int main() { int n,m;cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i];//默认以空格中止输入与输出 //把所有小写字母转换成大写 for(int j=0;j<=11;j++) { if(a[i][j]>='a'&&a[i][j]<='z') { a[i][j]=a[i][j]-32; } } w1.insert(a[i]); combine.insert(a[i]); } for(int i=1;i<=m;i++) { cin>>b[i]; //把所有小写字母转换成大写 for(int j=0;j<=11;j++) { if(b[i][j]>='a'&&b[i][j]<='z') { b[i][j]=b[i][j]-32; } } w2.insert(b[i]); combine.insert(b[i]); } cout<<w1.size()+w2.size()-combine.size()<<endl; cout<<combine.size()<<endl; return 0; }