/*求两个排好序的字符串的交集,假定字符串中全部是大写字母或者小写字母或者数字中的一种,默认s1的字符串长度大于等于s2;*/
#include <iostream.h>
#include <string.h>
int hash[26]={0};
void Intersection(char *s1,char *s2)
{
int num=0;
for (int i=0;i<strlen(s1);i++)
{
int index1=s1[i]-'A';
if (hash[index1]==0)
{
hash[index1]=1;
num++;
}
}
for (int j=0;j<strlen(s2);j++)
{
int index2=s2[j]-'A';
if (hash[index2]==1)
{
cout<<s1[index2]<<"\t";
num--;
}
if (num==0)
{
break;
}
}
}
void main()
{
char s1[]="ABCDEFG";
char s2[]="BCD";
cout<<"两个字符串的交集是:"<<endl;
Intersection(s1,s2);
}
运行结果如下:
时间复杂度为O(strlen(s1)+strlen(s2)),但是对于任意的字符串则存在问题,比如大写字母小写字母数字的随意组合的情况
对于任意字符串的交集,采用下面的“以一个字符串为基准,然后用另一个字符串与基准字符串逐一的比较”的方法,但是时间复杂度为O(M*N):
#include <iostream.h>
#include <string.h>
void main()
{
char s1[]="abc123D4EFh";
char s2[]="124EFabc";
char s3[20];
int k=0;
int flag=0;
for (int i=0;i<strlen(s1);i++)
{
for (int j=0;j<strlen(s2);j++)
{
if (s1[i]==s2[j])
{
s3[k++]=s1[i];
flag=1;
}
}
}
s3[k]='\0';
if (flag==1)
{
cout<<"有交集!"<<endl;
cout<<"交集为:"<<s3<<endl;
}
else
{
cout<<"没有交集!"<<endl;
}
}