题目描述:
给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B中所有字母是否都在字符串A里?
实现函数bool StringContains(string &A, string &B)
比如,如果是下面两个字符串:
String 1:ABCD
String 2:BAD
答案是true,即String2里的字母在String1里也都有,或者说String2是String1的真子集。
方法一:用了C++中的find函数。
bool StringContains(string &A, string &B)
{
string::size_type idx;
idx = A.find(B);
if(idx == string::npos )//不存在。
return false;
else//存在。
return true;
}
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
bool p = StringContains(s1,s2);
if (p==1)
{ cout<<"True"<<endl;
}
else cout<<"False"<<endl;
return 0;
}
方法二:排序后比较;分别将两个字符串排序,然后比较;如果第一个字符串中的字符小于第二个字符串中的字符,那么比较第一个字符串中此字符后面的字符,如果相等第二个字符串中的字符++,不相等就继续比较;如果第一个字符的pa指向最后那么证明没找到,返回false;或者第一个字符中的字符大于第二个字符中的字符也即没找到。
bool StringContains(string &a,string &b)
{
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int pa=0,pb = 0;
for (int i = 0; i < b.length(); i++)
{
while (pa<a.length()&&(a[pa]<b[pb]))
{
++pa;
}
if ((pa>=a.length())||a[pa]>b[pb])
{
return false;
}
++pb;
}
return true;
}
1、变位词
- 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,比如bad和adb即为兄弟字符串,现提供一个字符串,如何在字典中迅速找到它的兄弟字符串,请描述数据结构和查询过程。
参考:
https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.02.md