现在的位置: 首页 > 综合 > 正文

sicily——简单二分查找和排序

2013年08月11日 ⁄ 综合 ⁄ 共 1109字 ⁄ 字号 评论关闭

最近写了一道关于字符串查找问题,问题是:给你一序列字符串,然后再给出另外一序列字符串,在第一个序列中找出多少个字符串在第二个序列中没有出现过,忽略字符大小写。

例如:

第一个序列:

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;
}

 

 

抱歉!评论已关闭.