集合的包含问题

9 篇文章 0 订阅

题目1:给定两个字符串s1和s2,判断s2是否能够被s1做循环移位得到的字符串包含。

解决办法1-1:最直观的办法是将s1循环移位,并每次判断其是否包含。

解决办法1-2:在上一个办法上,我们可以做出一点改进。例如s1为ABDC,则将其循环移动(左移或右移都一样)后,所有的子串均包含在ABDCABDC中,所以我们直接判断s2是否是这个字符串的子串即可。

对应代码:

	public static String isIncluded(StringBuffer str1, StringBuffer str2){
		StringBuffer srcStr=str1.append(str1);
		if(srcStr.toString().contains(str2.toString())){ 
				return "true";
		}
		return "false";
	}

代码分析:

代码中直接用了String的一个自带函数即完成题目要求。需要注意的是,关于String和StringBuffer的使用,以及各自自带函数的类型,在上一篇文章中有所谈及,这里需特别注意!


题目2:给定两个数组A[N]和B[M],如果A和B的元素完全相同且顺序一致,则返回1;如果元素完全相同但顺序不一致,则返回2;如果B包含于A,则返回3;如果A包含于B,则输出4;如果都不是,则输出5。

解决方法1:对于两个长度相同的数组,使用ArrayList或者直接用Arrays,直接判断是否相等,是则返回1,不是则排序后再次判断是否相等,是则返回2,否则返回5。对于两个长度不同的数组,将其排序,排序中若出现1,2,3,4,4,5这种情况,即元素有重复时,即修改为1,2,3,4a1,4a2,5。这样保证了元素各自不同且可直接用于Set比较。此刻使用Set,判断是否包含。

代码1-1:

	public static int rSituation(int[] A,int[] B){
		if(A.length==B.length){
			return equalLen(A,B);
		}
		else{
			return notEqualLen(A,B);
		}
	}
	public static int equalLen(int[] A,int[] B){
		if(Arrays.equals(A, B))
			return 1;
		else{
			Arrays.sort(A);
			Arrays.sort(B);
			if(Arrays.equals(A, B))
				return 2;
			else
				return 5;
		}
	}
	public static int notEqualLen(int[] A,int[] B){
		Set<String> aS=intToUniqueSet(A);
		Set<String> bS=intToUniqueSet(B);
		System.out.println(aS.toString());
		System.out.println(bS.toString());
		if(aS.containsAll(bS))
			return 3;
		else if(bS.containsAll(aS))
			return 4;
		else
			return 5;
	}
	public static Set<String> intToUniqueSet(int[] A){
		Arrays.sort(A);
		Set<String> ret=new HashSet<String>();
		int flag=0;
		for(int i=0;i<A.length-1;++i){
			if(A[i]==A[i+1]){
				String tmp=new String().valueOf(A[i]);
				tmp+="a"+new String().valueOf(flag);
				ret.add(tmp);
				flag++;
			}
			else{
				flag=0;
				ret.add(new String().valueOf(A[i]));
			}	
		}
		ret.add(new String().valueOf(A[A.length-1]));
		return ret;
	}

代码分析:

写代码时,最需要注意的是containsAll()函数的使用!contains判断的是元素的属于,而containsAll判断的是集合的包含!不能自以为是的使用!

第二,可以使用Set<String>  也可以直接用Set来创建构造函数,例如Set<String> s=new HashSet<String>();和Set s=new HashSet()均可以,至于其中的区别,需进一步的研究和讨论!

解决方法2:思路和方法1一致,唯一不同的是自己来判断。长度相同时,一一对比,遇到不同时返回排序,再一一对比。长度不同时,先排序再判断是否为子序列。问题同样也得到解决。且很简单。


总结:

关于包含问题,利用已知数据结构如Set可以解决,但其要求元素不重复,这是思路一。或者将其排序或者找到规律(如题目一)后,可以转换成判断是否为子序列或者子串的问题,同样好解,这是思路二!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值