Хеш-таблица не дает желаемого результата - PullRequest
0 голосов
/ 09 мая 2018

Я попытался заполнить хэш-таблицу содержимым одного строкового массива, а затем сопоставить содержимое второго массива, если он все содержится в первом массиве.

, например

дай мне один великий сегодня ночью - Строка A

дай сегодня один великий - Строка B

Моя программа должна вывести Да, так как все содержимое строки B включено в А.

Подробный вопрос здесь: - 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, проблема, я думаю, состоит в том, что хэш-таблица не может соответствовать содержимому массива и его значению.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы можете упростить свой код, выполнив это

  • избавиться от запроса на ввод размера
  • Сбой быстро

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

Весь другой код такой же (нужно изменить только имя переменной)

0 голосов
/ 09 мая 2018

Ваш 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)
    
...