日期:2014-05-20  浏览次数:20581 次

几个答案用JAVA代码怎么实现呢?
比如,如果是下面两个字符串:


String 1: ABCDEFGHLMNOPQRS

String 2: DCGSRQPOM

答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:


String 1: ABCDEFGHLMNOPQRS

String 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代码怎么实现?线性扫描是什么意思?

------解决方案--------------------
第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楼的同学,用HashSet就好了,不需要HashMap,类似这样:
Java code

    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;
    }

------解决方案--------------------
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.}

------解决方案--------------------
Java code

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;    
            }