有两个字符串str1和str2,假设str1比str2长,求str2中的所有字符是否被字符串str1包含,即str2是否是str1的真子集。
(1)用散列表进行实现
即把str1中的所有字符放入散列表中,然后依次判断str2中的每个字符是否在散列表中存在,其时间复杂度为O(n+m)。其实现的代码如下:
package com.threeTop.www;
import java.util.Hashtable;
/**
* 用散列表进行实现
* @author wjgs
*
*/
public class StringContainUtils {
/**
* 散列表实现是否包含
* @param str1
* @param str2
* @return
*/
public static boolean contain(String str1,String str2)
{
Hashtable<Character, Integer> hashtable=new Hashtable<Character, Integer>();
for(int i=0;i<str1.length();i++)
{
//依次把str1中的字符放入散列表,散列表中的值没用,这里设为1
hashtable.put(str1.charAt(i), 1);
}
for(int i=0;i<str2.length();i++)
{
if(hashtable.get(str2.charAt(i))==null)
{
return false;
}
}
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(StringContainUtils.contain("ABCDEFG", "CDEF"));
System.out.println(StringContainUtils.contain("ABCDEFG", "Cm"));
}
}
(2)用位运算进行实现:原理和散列表一样,其时间复杂度为O(n+m),空间复杂度为O(1).
/**
* 使用位运算实现是否包含
* @param str1
* @param str2
* @return
*/
public static boolean contain2(String str1,String str2)
{
int result=0;
//对str1进行或操作
for(int i=0;i<str1.length();i++)
{
result|=(1<<(str1.charAt(i)-'A'));
}
//对str2进行与操作
for(int i=0;i<str2.length();i++)
{
if((result&(1<<(str2.charAt(i)-'A')))==0)
{
return false;
}
}
return true;
}