判断字符串包含的问题

来源:互联网 发布:有趣的工作 知乎 编辑:程序博客网 时间:2024/06/13 08:29

    有两个字符串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;}

0 0