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。




0 0
原创粉丝点击