比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPOM答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPOZ答案是false,因为第二个字符串里的Z字母不在第一个字符串里。怎么判断出ture or  false?1 从算法上讲,这需要O(n*m)次操作,其中n是string1的长度,m是string2的长度。就拿上面的例子来说,最坏的情况下将会有16*8 = 128次操作。2 先对这两个字符串的字母进行排序,然后同时对两个字串依次轮询。两个字串的排序需要(常规情况)O(m log m) + O(n log n)次操作,之后的线性扫描需要O(m+n)次操作。同样拿上面的字串做例子,将会需要16*4 + 8*3 = 88加上对两个字串线性扫描的16 + 8 = 24的操作。(随着字串长度的增长,你会发现这个算法的效果会越来越好)3 对第一个字串进行轮询,把其中的每个字母都放入一个Hashtable里(成本是O(n)或16次操作)。然后轮询第二个字串,在Hashtable里查询每个字母,看能否找到。如果找不到,说明没有匹配成功。这将消耗掉8次操作 —— 这样两项操作加起来一共只有24次。不错吧,比前面两种方案都要好。---------------
以上我是在看面试题目的时候看到的一段话、我想问下第2中方法以及第3中方法用JAVA代码怎么实现?线性扫描是什么意思?

解决方案 »

  1.   

    线性扫描的意思就是 一次性 扫描,强调从前到后一次性完成。中途不需要回退或回溯。其实算法并不复杂,认真读两次应该能理解;至于Java代码,看看有没有好心人写给你了。
      

  2.   


    哎、静候好心人啊~~~  JAVA代码纠结ing
      

  3.   

    可以提供一个思路:把ABCD........这些字母都对应一个指数,然后string1的字母相乘得s1,如果string2的字母没有重复的话可以把它相乘的s2,s1除以s2如果没有余数则证明包含.如果s2中有重复的字母,就只能循环单个除以s2的字母,同样也是判断余数!!!我想着有一道google面试题和这道差不多,提供的解法就是上边的思路.
      

  4.   

    第3种:
    import java.util.Hashtable;public class HashTableDemo {    private static  final  String  longStr = "ABCDEFGHLMNOPQRS";
        
        private static  final  String  shortStr = "DCGSRQPOM";
        
        private static  Hashtable<Integer,String>  table = new  Hashtable<Integer,String>();    public static  boolean  isContained(String  longStr,String  shortStr){
            boolean  flag = false;
            
            for(int i = 0;i<longStr.length();i++){
                table.put(i,longStr.charAt(i)+"");
            }
            for(int j = 0;j < shortStr.length();j++){
                if(table.containsValue(shortStr.charAt(j)+"")){
                    flag = true;
                    continue;
                }else{
                    flag = false;
                }
            }
            return   flag;
        }    public static void main(String[] args) {
            System.out.println(isContained(longStr,shortStr));
        }
        
    }
    结果是正确的
      

  5.   

    5楼的同学,用HashSet就好了,不需要HashMap,类似这样:    public static boolean isInclude(String main, String sub) {
            HashSet<Character> set = new HashSet<Character>();
            for (char c : main.toCharArray()) set.add(c);
            for (char c : sub.toCharArray()) if (!set.contains(c)) return false;
            return true;
        }
      

  6.   

    01./** 
    02. * 查找某些字符是否在另一个字符串里出现 
    03. *  
    04. * @author Java人(java2000.net) 
    05. */  
    06.public class Test {  
    07.  /** 
    08.   * @param args 
    09.   */  
    10.  public static void main(String[] args) {  
    11.    String a = "abcd,efg";  
    12.    String b = ")(*&^%$#@![]{},.///;:'? <>";  
    13.    byte[] bb = new byte[256];  
    14.    char[] cs = b.toCharArray();  
    15.    for (char c : cs) {  
    16.      bb[c] = 1;  
    17.    }  
    18.    cs = a.toCharArray();  
    19.    for (char c : cs) {  
    20.      if (bb[c] == 1) {  
    21.        System.out.println(c);  
    22.      }  
    23.    }  
    24.  }  
    25.}  
      

  7.   

    http://blog.csdn.net/java2000_net/article/details/5250740
      

  8.   


    char[] s2Arr = s2.toCharArray();
    int len = 0;
    for (char c : s2Arr) {
    if(s1.indexOf(c) > 0){
    len ++;
    }
    }
    if(len == s2Arr.length){
    return true;
    }else{
    return false;
    }