package jiegouSuanfa;
/**
* 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短
* 请问,如何最快地判断字符串B中所有字母是否都在字符串A里
* @author 97699
*
*/
public class IncludeTest {
private static String str="asdfafaafds";
private static String str2="asdfg";
public static void main(String[] args) {
System.out.println("使用暴力方法求解:"+baoli());
System.out.println("排序后一一对照:"+sorted());
System.out.println("使用素数乘积求mod方法:"+su());
}
/**
* 对字符串中的字符进行快速排序,后判断如果m中的字符不在n中false
* 时间复杂度O((mlgm+nlgn)*(m+n))
* @return
*/
private static boolean sorted() {
// TODO Auto-generated method stub
char[] n=str.toCharArray();
quickSort(n,0,n.length-1);
char[] m=str2.toCharArray();
quickSort(m,0,m.length-1);
for(int i=0,j=0;j<str2.length();j++) {
while((i<str.length())&&n[i]<m[j]) {
i++;
}
if(i>=str.length()||n[i]>m[j]) {
return false;
}
}
return true;
}
private static void quickSort(char[] n, int left, int right) {
// TODO Auto-generated method stub
if(right<left) {
return;
}
char t=n[left];
int i=left;
int j=right;
while(i!=j) {
while(i<j&&n[j]>=t) j--;
while(i<j&&n[i]<=t) i++;
if(i<j) {
char m=n[i];
n[i]=n[j];
n[j]=m;
}
}
n[left]=n[i];
n[i]=t;
quickSort(n,left,i-1);
quickSort(n,i+1,right);
}
/**
* 令每一个字母对应一个素数,求出mul
* mul%str2中的字母对应的素数,如果不能整除,false
* 时间复杂度O(m+n)
* @return
*/
private static boolean su() {
// TODO Auto-generated method stub
int[] p = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,61, 67, 71, 73, 79, 83, 89, 97, 101};
char[] n=str.toCharArray();
char[] m=str2.toCharArray();
int mul=1;
for(int i=0;i<str.length();i++) {
if(mul%p[n[i]-'a']!=0) {
mul*=p[n[i]-'a'];
}
}
for(int j=0;j<str2.length();j++) {
if(mul%p[m[j]-'a']!=0) {
return false;
}
}
return true;
}
/**
* 暴力方法求解,时间O(mn)
* @return
*/
private static boolean baoli() {
// TODO Auto-generated method stub
char[] n=str.toCharArray();
char[] m=str2.toCharArray();//各个字符串
for(int i=0;i<str2.length();i++) {
for(int j=0;j<str.length();j++) {
if(m[i]==n[j]) {
break;
}
if(m[i]!=n[j]&&j==str.length()-1) {
return false;
}
}
}
return true;
}
}