IT企业面试题(java描述)-字符串包含(1)

题目:

给出长字符串和短字符串,检查短字符串里面的字符是否都在长字符串里面出现。

例子:

长字符串:“abc”

短字符串:“abc” "abb" “ae”

检查结果是:true,true,false


1.思路

(1)暴力解法

使用双循环轮询,但是这种算法的缺点是时间复杂度为O(m*n)

(2)使用HashMap的特性

这里利用的特性是key是不重复的,把每一个字符放到里面当成key,就可以去了重,而且当短字符串的字符放到里面的key时,如果是相同的字符,那么最后map的keyset长度应该跟长字符串一样,如果有不一样的字符,那么最后map的keyset的长度应该比原来的要长。

例如:我们将“abcde”放到map里面,那么map的keyset返回应该是“a,b,c”,keyset的长度是3

当短字符串“abc”放到map里面时,由于map的key的唯一性,那么keyset的长度是3,同理,“abb” 也是如此。

但是当短字符串“ae"放到map里面时,由于map的key的唯一性,那么keyset的长度是4,这时就证明存在不同的字符。

但是当“ae”

利用HashMap的特性,首先把长字符串按字符放入map里面,计算map的size,然后再把短字符串按字符放进去,在计算map的size,对比两次的结果,如果是等于,就是都在里面,如果是大于,就是有不在的字符

这种算法的空间复杂度是O(m+n)



2.代码

(1)暴力解法代码:

package com.ray.interview.ch01.topic_1_2;

/**
 * 检查字符串b里面的字符是否在a里面都出现过
 * 
 * @author raylee
 * @date 2016-02-16
 * @version 1.0
 */
public class ContainString_1 {

	public static boolean isContain(String a, String b) {
		boolean isContainStr = true;
		char[] charA_array = a.toCharArray();
		char[] charB_array = b.toCharArray();
		for (int i = 0; i < charB_array.length; i++) {
			boolean isContainChar = false;
			for (int j = 0; (j < charA_array.length); j++) {
				if (charA_array[j] == charB_array[i]) {
					isContainChar = true;
					break;
				}
			}
			if (!isContainChar) {
				isContainStr = false;
				break;
			}
		}
		return isContainStr;
	}

	public static void main(String[] args) {
		String a = "abc", b = "abb";
		System.out.println(isContain(a, b));
		String c = "abc", d = "aaa";
		System.out.println(isContain(c, d));
		String e = "cba", f = "ea";
		System.out.println(isContain(e, f));
	}

}

测试返回:

true
true
false


(2)使用HashMap的代码:

package com.ray.interview.ch01.topic_1_2;

import java.util.HashMap;

/**
 * 检查字符串b里面的字符是否在a里面都出现过
 * 
 * @author raylee
 * @date 2016-02-16
 * @version 1.0
 */
public class ContainString_2 {

	public static boolean isContain(String a, String b) {
		boolean isContainStr = true;
		char[] charA_array = a.toCharArray();
		char[] charB_array = b.toCharArray();
		HashMap<Character, Character> map = new HashMap<>();
		for (int i = 0; i < charA_array.length; i++) {
			map.put(charA_array[i], charA_array[i]);
		}
		int sizeA = map.keySet().size();
		for (int i = 0; i < charB_array.length; i++) {
			map.put(charB_array[i], charB_array[i]);
		}
		int sizeB = map.keySet().size();
		if (sizeA < sizeB) {
			isContainStr = false;
		}
		return isContainStr;
	}

	public static void main(String[] args) {
		String a = "abc", b = "abb";
		System.out.println(isContain(a, b));
		String c = "abc", d = "aaa";
		System.out.println(isContain(c, d));
		String e = "cba", f = "ea";
		System.out.println(isContain(e, f));
	}

}

测试返回:

true
true
false


总结:这一章节主要介绍了字符串包含面试题的两种思路和代码。


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值