我尝试使用一个字符串数组的内容填充哈希表,然后匹配第二个数组的内容,如果它全部包含在第一个数组中。
e.g。
今天晚上给我一个盛大的活动 - String A今天给一个盛大 - String B
我的程序应该输出是,因为字符串B的所有内容都包含在A中。
详细问题在这里: - https://www.hackerrank.com/challenges/ctci-ransom-note/problem
这是我的Java代码: -
$file
相反它给出了False,我认为问题是哈希表不能匹配数组的内容及其值。
答案 0 :(得分:0)
由于您初始化它的方式,您的Hashtable
仅包含单个键值对:
hm.put(1,magazine[magazine_i]);
首先尝试纠正
顺便说一句,你的做法是错误的。
要生成ransom
,您必须确保ransom
中的所有字词都包含在magazine
中,并且magazine
中该字词的数量应该更大大于或等于ransom
中该词的相应计数。
也就是说,如果ransom
包含4个单词'今天',那么在magazine
中,您必须确保今天至少有4个单词。
因此,您应该像这样解决问题:
从magazine
,为magazine
HashMap<String, Integer> magazineWordCount
建立字数统计地图。
从ransom
,为ransom
构建字数统计地图:HashMap<String, Integer> ransomWordCount
循环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]);
}
所有其他代码都相同(只需更改变量名称)