Skip to content

Commit ca5ce27

Browse files
committed
添加“1.2:字符串包含.java"参考代码;
1 parent b0ae724 commit ca5ce27

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.yousharp.julycoding.string;
2+
3+
/**
4+
* 1.2 字符串包含
5+
* (july github链接:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.02.md)
6+
*
7+
* User: lingguo
8+
* Date: 14-6-29
9+
*/
10+
public class StringContain {
11+
12+
/**
13+
* * 问题描述:
14+
* 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B
15+
* 中所有字母是否都在字符串A里?为了简单起见,我们规定输入的字符串只包含大写英文字母。比如String A:ABCD,String B:BAD,
16+
* 返回true;string A:ABCD,string B:BCE,返回false;String A:ABCD,String B:AA,返回true。
17+
*
18+
* 思路:
19+
* 思路一:遍历字符串B,判断每一个字符是否出现在字符串A中,时间复杂度O(n*m),空间复杂度O(1);
20+
* 思路二:先对两个字符串排序,然后同时遍历字符串A和B,判断B中的每一个字符是否都在字符串A中。时间复杂度O(nlogn),空间复杂度O(1);
21+
* 思路三:将每一个字符映射到一个素数上,对字符串A中的每一个字符表示的素数,求累积;然后遍历字符串B,用每一个字符表示的素
22+
* 数去除字符串A的累积,判断余数是否为0。时间复杂度:O(n),空间复杂度O(1)。可能存在的问题:乘积时可能会溢出。
23+
* 思路四:如果可以使用Java中的数据结构,HashMap和Set可以很方便地解决问题;如果不能,我们可以构造一个“签名”,将每一个字
24+
* 符映射为整数(范围:0到26),然后遍历A中的每一个字符,将32位整数的对应位置1(整数初始为0),最后遍历B中的每一个字符,判断
25+
* 每一个字符代表的整数在整数中是否已置位。时间复杂度O(n),空间复杂度O(1),思路四为最优算法。
26+
*
27+
* 这里仅给出思路四的示例代码。
28+
*
29+
* @param s1
30+
* @param s2
31+
* @return
32+
*/
33+
public static boolean hashCheck(char[] s1, char[] s2) {
34+
int mask = 0;
35+
for (char c: s1) {
36+
mask = mask | (1 << (c - 'A'));
37+
}
38+
for (char c: s2) {
39+
if ((mask & (1 << (c - 'A'))) == 0) {
40+
return false;
41+
}
42+
}
43+
return true;
44+
}
45+
}

0 commit comments

Comments
 (0)