哈希表没有给出所需的输出

时间:2018-05-09 07:21:35

标签: java data-structures hash hashtable

我尝试使用一个字符串数组的内容填充哈希表,然后匹配第二个数组的内容,如果它全部包含在第一个数组中。

e.g。

今天晚上给我一个盛大的活动 - String A

今天给一个盛大 - String B

我的程序应该输出是,因为字符串B的所有内容都包含在A中。

详细问题在这里: - https://www.hackerrank.com/challenges/ctci-ransom-note/problem

这是我的Java代码: -

$file

相反它给出了False,我认为问题是哈希表不能匹配数组的内容及其值。

2 个答案:

答案 0 :(得分:0)

由于您初始化它的方式,您的Hashtable仅包含单个键值对:

   hm.put(1,magazine[magazine_i]);

首先尝试纠正

顺便说一句,你的做法是错误的。

要生成ransom,您必须确保ransom中的所有字词都包含在magazine中,并且magazine中该字词的数量应该更大大于或等于ransom中该词的相应计数。

也就是说,如果ransom包含4个单词'今天',那么在magazine中,您必须确保今天至少有4个单词。

因此,您应该像这样解决问题:

  1. magazine,为magazine HashMap<String, Integer> magazineWordCount建立字数统计地图。

  2. ransom,为ransom构建字数统计地图:HashMap<String, Integer> ransomWordCount

  3. 循环ransom个密钥(ransomWordCount.keySet()),检查

     magazineWordCount.contains(word) && magazineWordCount.get(word) >= ransomWordCount.get(word)
    

答案 1 :(得分:0)

您可以通过此操作简化代码

  • 摆脱提示输入大小
  • 快速失败

    Scanner in = new Scanner(System.in);
    System.out.println("Enter sentence 1");
    String s1 = in.nextLine();
    System.out.println("Enter sentence 2");
    String s2 = in.nextLine();
    
    List<String> s1List = Arrays.asList(s1.split(" "));
    for (String w : s2.split(" ")) {
        System.out.println("loooking for " + w);
        if (s1List.contains(w) == false) {
            System.out.println("Failed to find");
            return;
        }
    }
    System.out.println("yes");
    

修改

如果您想使用Hashtable,那么您可以像

一样填写它
    String [] arr = s1.split(" ");
    Hashtable <Integer, String> s1ht = new Hashtable<Integer, String>();
    for (int i = 0; i < arr.length; i++) {
        s1ht.put(i, arr[i]);
    }

所有其他代码都相同(只需更改变量名称)