題目:給定長字符串a(chǎn)和段字符串b盖淡,如何判斷短字符串中所有字符均在長字符串a(chǎn)中?
示例:
a="ABCD", b="BAD" 返回true狡相;
a="ABCD", b="BCE" 返回false愧膀;
a="ABCD", b="AAA" 返回true;
解法1:排序后輪詢谣光,拿著字符串b中的每一個(gè)字符去字符串a(chǎn)中查詢
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool stringcontain(string &a,string &b)
{
sort(a.begin(),a.end());
sort(b.begin(),b.end());
for(int pa =0,pb=0;pb<b.length();) //每次從b中取出一個(gè)字符,在a中進(jìn)行查詢
{
//如果還沒查到字符串a(chǎn)的尾部芬为,或者a中目前查到的元素比b中被查詢的元素還小萄金,則把pa后移一位
while((pa<a.length())&&(a[pa]<b[pb]))
{
++pa;
}
//如果pa都到頭了,還沒有找到目標(biāo)元素媚朦,或者a中的元素都比目標(biāo)元素大了(之前排過序氧敢,比如要查字典中B開頭單詞,結(jié)果都翻到C開頭的部分了還沒找到想找的單詞)询张,則說明字符串a(chǎn)中不存在目標(biāo)元素
if((pa>=a.length())||(a[pa]>b[pb]))
{return false;}
++pb;
}
return true;
}
int main(int argc, char *argv[])
{
string s1="ABCDE";
string s2="AAAA";
if(stringcontain(s1,s2))
cout <<"true"<<endl;
else
cout << "false"<<endl;
return 0;
}
解法2:位運(yùn)算
#include <iostream>
#include <string>
using namespace std;
bool stringcontain(string &a,string &b)
{
int hash=0;
for(int i=0;i<a.length();++i)
{
hash|=(1<<(a[i]-'A'));
}
for(int i=0;i<b.length();++i)
{
//依次用字符串b中每一個(gè)字符去與前面得到的hash相與孙乖,如果相與得0說明有不同字符(與運(yùn)算的規(guī)則是“一一得1,其余得0”)份氧,因此如果有不存在的字符就得0
if((hash &(1 <<(b[i]-'A')))==0)
{
return false;
}
}
return true;
}
int main(int argc, char *argv[])
{
string s1="ABCDE";
string s2="AASAA";
if(stringcontain(s1,s2))
cout <<"true"<<endl;
else
cout << "false"<<endl;
cout << (1<<0x00);
return 0;
}