最近写了一道关于字符串查找问题,问题是:给你一序列字符串,然后再给出另外一序列字符串,在第一个序列中找出多少个字符串在第二个序列中没有出现过,忽略字符大小写。
例如:
第一个序列:
Inkfish
Henry
Carp
Max
Jericho
第二个序列:
Carp
Max
Carp
结果:3
这个问题解题首先是:1)首先对第一序列全部转换成小写,然后对第一个序列进行排序。2)用二分查找对第二个序列进行查找,看它是否在第一个序列中出现过:
#include "stdafx.h"
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
string s1[20000];
string s2[20000];
int flag[20001];
int bfind(string s,int low,int high){//二分查找函数
int l,h;
l = low;
h = high;
int mid = (l+h)/2;
if(l>h)
return -1;
if(s == s1[mid])
return mid;
else if (s>s1[mid])
return bfind(s,mid+1,high);
else
return bfind(s,low,mid-1);
}
int main(){
int n,m;
while(cin>>n&&n!=0){
cin>>m;
int count=0;
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++){
cin>>s1[i];
for(int j=0;j<s1[i].length();j++){//将所有字符转换成小写
if(s1[i][j]<97)
s1[i][j] = s1[i][j] + 32;
}
}
sort(s1,s1+n);
for(int i=0;i<m;i++){
cin>>s2[i];
for(int j=0;j<s2[i].length();j++){//将所有字符转换成小写
if(s2[i][j]<97)
s2[i][j] = s2[i][j] + 32;
}
}
for(int j=0;j<m;j++){
int a = bfind(s2[j],0,n-1);
if(a!=-1&&flag[a]==0){
count++;
flag[a]=1;
}
}
cout<<(n-count)<<endl;
count=0;
}
return 0;
}