给 定 两 个 分 别 由 字 母 组 成 的 字 符 串 A 和 字 符 串 B,字 符 串 B 的 长 度 比 字 符 串 A 短。请 问, 如 何 最 快 地 判 断 字 符 串 B 中 所 有 字 母 是 否 都 在 字 符 串 A 里?
package cn.algorithm;
/**
* @author Duoduo
* @version 1.0
* @date 2017/4/17 21:24
*/
public class StringContain {
public static void main(String[] args) {
char[] a = new char[5];
a[0] = 'a';
for (int i = 1; i < a.length; i++) {
a[i] = (char) (a[0] + i);
}
char[] b = {'a', 'b'};
boolean result = stringContain(a, b);
System.out.println(result);
}
/**
* 给 定 两 个 分 别 由 字 母 组 成 的 字 符 串 A 和 字 符 串 B,字 符 串 B 的 长 度 比 字 符 串 A 短。
* 请 问, 如 何 最 快 地 判 断 字 符 串 B 中 所 有 字 母 是 否 都 在 字 符 串 A 里?
* 一个int是32位
* 利用类似hash算法的原理
* 1.把a数组中的所有的数据存放在一个hashTable中
* 2.遍历数组b中的所有数据是否在hashTable中,如果都存在,则是包含关系,只要有一个不存在,则不是包含关系
*
* @param a
* @param b
* @return
*/
public static boolean stringContain(char[] a, char[] b) {
int hash = 0;
for (int i = 0; i < a.length; i++) {
// System.out.println("===================");
// System.out.println(a[i]);
// System.out.println(a[i] - 'A');
// System.out.println(1 << (a[i] - 'A'));
hash |= (1 << (a[i] - 'A'));
System.out.println(hash);
}
for (int i = 0; i < b.length; i++) {
if ((hash & (1 << (b[i] - 'A'))) == 0) {
return false;
}
}
return true;
}
}