// 字符串包含问题。str2中的所有字符,在str1中都出现了。则说str1包含str2.
// 给出str1和str2,判断str1是否包含str2
#include <iostream>
#include <string.h>
#include <assert.h>
using namespace std;
void SetBit(unsigned int *an, int n)
{
assert(an!=NULL && n>=0 && n<256);
int n1=n/32;
int n2=n%32;
unsigned int &t=*(an+n1);
t = t | (1<<n2);
}
void ClearBit(unsigned int *an, int n)
{
assert(an!=NULL && n>=0 && n<256);
int n1=n/32;
int n2=n%32;
unsigned int &t=*(an+n1);
t = t & ~(1<<n2);
}
int getBit(unsigned int *an, int n)
{
assert(an!=NULL && n>=0 && n<256);
int n1=n/32;
int n2=n%32;
unsigned int t=*(an+n1);
int r = (t<<(31-n2))>>31;
return r;
}
bool isStrIn(const char *str1, const char *str2)
{
assert(str1!= NULL && str2 != NULL);
int m=strlen(str1);
int n=strlen(str2);
unsigned int bitm[8];
memset(bitm, 0, sizeof(unsigned int)*8);
int i;
for (i=0; i<m; i++)
{
SetBit(bitm, (unsigned int)(unsigned char)str1[i]);
}
for (i=0;i<n;i++)
{
if (getBit(bitm, str2[i]) != 1)
{
return false;
}
}
return true;
}
int main()
{
char str1[]={"I love C++ abcdefg"};
char str2[]={"abcd"};
char str3[]={"abcx"};
cout<<str1<<" "<< (isStrIn(str1,str2)?"contains ":"DO NOT Contains ") <<str2<<endl;
cout<<endl;
cout<<str1<<" "<< (isStrIn(str1,str3)?"contains ":"DO NOT Contains ") <<str3<<endl;
cout<<endl;
return 0;
}