关于字符串的包含问题
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; }
相关文章推荐
- 用Margin还是用Padding
- gulp教程之gulp-rev-append
- 百度地图SDK 基本使用
- Java异常处理机制【转载】
- mac mysql gz 安装
- CDockablePane上面的工具条CMFCToolBar,怎么加ToolTips(信息提示)或者Prompt(状态栏提示)
- leetcode Invert Binary Tree
- shell 文本替换命令
- 流API--流的基础知识
- android 使用Handler 会导致内存泄漏问题
- Android通过php插入查询SQL数据库
- iOS开发 - 如何向App Store提交应用
- 关于android studio在创建Fragment过程中support不被识别的解决方案
- leetcode Binary Search
- 流API--流的基础知识
- c++中的对象引用(object reference)与对象指针的区别
- 看懂UML类图和时序图
- sql字符串查找大小写敏感相关
- 虚函数的实现机制
- 广义表算法库及应用