您的位置:首页 > 其它

关于字符串的包含问题

2015-11-09 16:25 405 查看
关于字符串包含问题的几个解决办法的总结!

/*
*程序说明:给定一个长字符串a和一短字符串b,如何最快的判断出短字符串b中的所有字符都在长字符串a中?
*程序思路:
*/

#include <iostream>
#include <string>
using namespace std;

//我首先想到的最傻逼的方法是:遍历短字符串中的字符,每读取短字符串中的一个字符,那么遍历一次长字符串
//看看长字符串中有没有相同的字符,直到遍历完短字符串中的所有字符为止
bool stringContain1(string &a,string &b){
int index = 0;//指示长字符串索引的计数器,其实这个index变量是多余的,可以用j来代替index
for(int i = 0;i < b.size();i++){
for(int j = 0;j < a.size();j++){
if(b[i] == a[j]){
break;//结束当前循环
}else{
index++;
continue;
}
}
if(index == a.size()){
return false;
}
index = 0;
}
return true;
}
//书上给出的蛮力轮循的算法,代码更加简洁,时间复杂度为O(i*j)
bool stringContain2(string &a,string &b){
for(int i = 0;i < b.length();i++){
int j;
for(j = 0;(j < a.length()) && (a[j] != b[i]);++j)
;
if(j >= a.length()){
return false;
}
}
return true;
}

//另一种方法,先排序,排序后进行轮循
bool stringContain3(string &a,string &b){
sort(a.begin(),a.end());
sort(b.begin(),b.end());
for(int pa = 0,pb = 0;pb < b.length();){
while((pa < a.length) && (a[pa] < b[pa])){
++pa;
}
if(pa >= a.length || a[pa] > b[pa]){
return false;
}
++pb;
}
return true;
}
//另一种方法,位运算法,感觉十分巧妙,实质是用一个整数代替了散列表,空间复杂度为O(1),时间复杂度为O(m+n)
bool stringContain4(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){
if((hash & (1 << b[i] - 'A'))) == 0){
return false;
}
}
return true;
}
int main(int argc, char *argv[])
{
string a = "abcdefg";
string b = "ccc";
bool flag = stringContain(a,b);
cout<<flag<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: