哈希 Table 未提供所需的输出

The Hash Table does not gives the desired output

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

例如

今天晚上给我一首盛大的曲子 - String A

今天给一个盛大的 - 字符串 B

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

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

这是我的 Java 代码:-

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();
        String magazine[] = new String[m];
        for(int magazine_i=0; magazine_i < m; magazine_i++){
            magazine[magazine_i] = in.next();
        }
        String ransom[] = new String[n];
        for(int ransom_i=0; ransom_i < n; ransom_i++){
            ransom[ransom_i] = in.next();
        }

        Hashtable<Integer,String> hm = new Hashtable<Integer,String>();
        for(int magazine_i=0; magazine_i < m; magazine_i++){
            hm.put(1,magazine[magazine_i]);
            //System.out.println(magazine[magazine_i]);
        }

        boolean isavailable = false;

        for(int ransom_i=0; ransom_i < n; ransom_i++){
            isavailable = hm.containsValue(ransom[ransom_i]);
            //System.out.println(ransom[ransom_i]+" "+isavailable);
            if(isavailable==flase)
            {System.out.println("No"); break;}
        }

        if(isavailable==true)
            System.out.println("Yes");

    }
 }

相反,它给出了 False,我认为问题是散列 table 无法匹配数组的内容及其值。

你的 Hashtable 只包含一个键值对,因为你初始化它的方式:

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

先尝试改正

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

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

中该词的相应计数

也就是说,如果ransom包含4个词'today',那么在magazine中,你必须保证至少有4个词'today'。

因此,您应该这样处理问题:

  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)
    

您可以通过这样做来简化代码

  • 去掉输入大小的提示
  • 快速失败

    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");
    

编辑

如果你想使用哈希表,那么你可以像这样填写它

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

其他代码相同(只需要更改变量名)