字符串包含

package com.refe.algorithm;

import org.junit.Test;

/*假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。
 * 什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?
 * 比如,如果是下面两个字符串:
 * String 1: ABCDEFGHLMNOPQRS
 * String 2: DCGSRQPO
 * 答案是true,所有在string2里的字母string1也都有。
 * 如果是下面两个字符串:  
 * String 1: ABCDEFGHLMNOPQRS   
 * String 2: DCGSRQPZ 
 * 答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
 * 
 *  思路:
 *  思路一:遍历字符串B,判断每一个字符是否出现在字符串A中,时间复杂度O(n*m),空间复杂度O(1);
 *  思路二:先对两个字符串排序,然后同时遍历字符串A和B,判断B中的每一个字符是否都在字符串A中。时间复杂度O(nlogn),空间复杂度O(1);
 *  思路三:将每一个字符映射到一个素数上,对字符串A中的每一个字符表示的素数,求累积;然后遍历字符串B,用每一个字符表示的素
 *  数去除字符串A的累积,判断余数是否为0。时间复杂度:O(n),空间复杂度O(1)。可能存在的问题:乘积时可能会溢出。
 *  思路四:如果可以使用Java中的数据结构,HashMap和Set可以很方便地解决问题;如果不能,我们可以构造一个“签名”,将每一个字
 *  符映射为整数(范围:0到26),然后遍历A中的每一个字符,将32位整数的对应位置1(整数初始为0),最后遍历B中的每一个字符,判断
 *  每一个字符代表的整数在整数中是否已置位。时间复杂度O(n),空间复杂度O(1),思路四为最优算法。
 * */
public class StringContain {

	@Test
	public void test() {
		String str1 = "ABCDEFGHLMNOPQRS";
		String str2 = "DCGSRQPO";
		// String str1 = "ABCDEFGHLMNOPQRS";
		// String str2 = "DCGSRQPZ";
		judge(str1, str2);
	}

	private static void judge(String str1, String str2) {
		int mask = 0;
		boolean flag = true;
		char[] ch1 = str1.toCharArray();
		char[] ch2 = str2.toCharArray();
		for (char c : ch1) {
			mask = mask | (1 << (c - 'A'));
		}
		System.out.println(mask);
		for (char c : ch2) {
			if ((mask & (1 << (c - 'A'))) == 0) {
				flag = false;
				break;
			}
		}
		System.out.println(flag);
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值