002字符串包含
来源:互联网 发布:单位网络监测系统 知乎 编辑:程序博客网 时间:2024/06/05 19:11
2014.6.17
题目描述:
给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B中所有字母是否都在字符串A里?
为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数bool StringContains(string &A, string &B)
比如,如果是下面两个字符串:
String 1:ABCD
String 2:BAD
答案是true,即String2里的字母在String1里也都有,或者说String2是String1的真子集。
如果是下面两个字符串:
String 1:ABCD
String 2:BCE
答案是false,因为字符串String2里的E字母不在字符串String1里。
同时,如果string1:ABCD,string 2:AA,同样返回true。
方案一:暴力法——将string2中的每个字符与string1中的进行比较,如果所有的都能匹配则true,否则false。
方案二:
先排序后匹配——排序可以用快排<时间复杂度为O(nlongn)>,将排好序的两个字符串进行线性匹配,时间复杂度是O(n+m),因此整体时间复杂度是O(nlongn)+O(mlongm)+O(n+m)。
int partition(string &str,int start, int end){int key = str[end];int i = start - 1 ;for(int j=start;j<end;j++){if(str[j]<key){i++;swap(str[i],str[j]);}}swap(str[i+1],str[end]);return i+1;}void quickSort(string &str, int start, int end){if(start<end){int k = partition(str,start,end);quickSort(str,0,k-1);quickSort(str,k+1,end);}}bool stringContain1(string &str1,string &str2){int n1=str1.length();int n2=str2.length();quickSort(str1,0,n1-1);quickSort(str2,0,n2-1);for(int s1=0,s2=0;s2<n2;s2++){while((s1<n1) && (str1[s1]<str2[s2])){s1++;}if(s1>=n1 || str1[s1]>str2[s2])return false;}return true;}
或者排序利用计数排序,然后进行线性匹配
计数排序就是首先扫描一遍数组,将每个元素的排序顺序编号存储起来,然后将确定将各个元素填到相应的位置时间复杂度O(n+m)+O(n+m)=O(n+m),空间复杂度为O(n+m)
void countSort(string str,string &help_str){int helparr[26]={0};for(int i=0;i<str.length();i++){int index = str[i] - 'A';helparr[index] +=1;}for(int j=1;j<26;j++){helparr[j] += helparr[j-1];}for(int k=str.length()-1;k>=0;k--){int index = str[k] - 'A';int pos = helparr[index]-1;help_str[pos] = str[k];helparr[index]--;}cout<<"sortArry: "<<help_str<<endl;}bool stringContain2(string &str1,string &str2){int n1=str1.length();int n2=str2.length();countSort(str1,str1);countSort(str2,str2);for(int s1=0,s2=0;s2<n2;s2++){while((s1<n1) && (str1[s1]<str2[s2])){s1++;}if(s1>=n1 || str1[s1]>str2[s2])return false;}return true;}
方案三:hash表,时间复杂度O(n+m),段字符串存入hash表,然后用长字符串的元素进行查找,找到继续,否则为false。
方案四:利用辅助整型数组初始为0,由26个元素构成,首先遍历short_str将其拥有的字符对应的辅助数组元素加1,遍历long_str,将辅助数组中对应的元素减1,最后判断辅助数组的元素值,如果有正值,则false,否则为true。时间和空间复杂度都是O(n+m)。
方案五:利用素数的不可分性,将每个字母与一个素数唯一对应,对于long_sr中的每个元素,找到其对应的素数,然后相乘,形成一个大的整数,然后用这个整数去除short_str中的元素对应的素数,如果有余数则为false,除到最后都可整除则为true。
- 002字符串包含
- 字符串包含
- 包含字符串
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含
- 字符串包含字符串
- 检测字符串包含字符串
- 字符串中包含指定字符串
- NSString与int和float的相互转换
- 数据结构《21》----2014 WAP 初试题----Immutable queue
- chrome命令行参数
- Keystone对象模型
- Object C学习笔记2-NSLog 格式化输出数据
- 002字符串包含
- ARM体系结构与编程-5
- 人生的头一次,总是这么多
- property Get Set方法
- Extjs form.submit()提交与Ext.Ajax.request的区别
- JA检索-国际期刊S&T (Sensors and Transducers journal)
- Android开源项目汇总-个人备忘
- acm~对象转换
- java 之DelayQueue实际运用示例