首页 > 代码库 > 字符串是否包含问题

字符串是否包含问题

题目描述

假设这有两个分别由字母组成的字符串A另外字符串B,字符串B的字母数较字符串A少一些。什么方法能最快地查出字符串B所有字母是不是都在字符串A里?也就是说判断字符串B是不是字符串A的真子集(为了简化,姑且认为两个集合都不是空集,即字符串都不为空。)。

分析与解法

解法一:暴力轮询
就是将B中的每一字符都和A中的字符做对比,思想简单此处就不再实现

解法二:普通排序
就是先对A 和 B做排序,然后对比B和A

/**
	 * <p>
	 * 普通排序的方式
	 * </p>
	 * @author zhangjunshuai
	 * @date 2014-5-14 下午4:51:31
	 */
	public static void sortMy(){
		String[] B = "a,w,d,f,e".split(",");
		String[] A = "a,b,c,e,d,f,g,h,i,j".split(",");
		Arrays.sort(A);
		Arrays.sort(B);
		
		for(int pa=0,pb=0;pb<B.length;){
			while((pa<A.length)&&((A[pa].toCharArray())[0]<(B[pb].toCharArray())[0])){//请注意此处的巧妙
				++pa;
			}
			if(pa>=A.length||(A[pa].toCharArray())[0]>(B[pb].toCharArray())[0]){//此处是跳出循环
				
				break;
			}
			++pb;
			
		}
		
	}

解法三:计数比较法
因为字符总数都在一个固定范围内,小写字母是26个,所以我们可以创建一个长度为26的整数组,用来记录A中的字符出现的次数,为了便于B对比。我们又利用所有字符相对于初始字母‘a’的距离做数组下标,这样的话我们就可以用count[1] 记录在A中字母b出现的次数,以此类推。遍历完A之后,再让B和count数组比较,如果出现count中为0,而B中有的则B不完全包含在A中。
/**
	 * <p>
	 * 计数比较法
	 * </p>
	 * @author zhangjunshuai
	 * @date 2014-5-14 下午5:22:41
	 */
	public static void countMy(){
		String A = "abcekdjflti";
		String B ="flt";
		char[] a= A.toCharArray();
		char[] b = B.toCharArray();
		int[] count = new int[26];
		for(char cc:a){
			++count[cc-‘a‘];
		}
		for(char bb :b){
			if(count[bb-‘a‘]==0){
				System.out.println("不在其中");
				break;
			}
		}
	}

PS:
本文是本人在学习July算法时候所做笔记,所有思想目前都来自此地址。