字符串包含

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;
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值