首页 > 代码库 > 字符串是否包含问题
字符串是否包含问题
题目描述
假设这有两个分别由字母组成的字符串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算法时候所做笔记,所有思想目前都来自此地址。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。