SHARE
SPREAD
HELP

The Tradition of Sharing

Help your friends and juniors by posting answers to the questions that you know. Also post questions that are not available.


To start with, Sr2Jr’s first step is to reduce the expenses related to education. To achieve this goal Sr2Jr organized the textbook’s question and answers. Sr2Jr is community based and need your support to fill the question and answers. The question and answers posted will be available free of cost to all.

 

#
Authors:
Walter Savitch ,kenrick Mock
Chapter:
Arrays
Exercise:
Programming Projects
Question:19 | ISBN:9780132830317 | Edition: 5

Question

Some word games require the player to find words that can be formed using the letters of another word. For example, given the word SWIMMING, other words that can be formed using the letters include SWIM, WIN, WING, SING, MIMING, etc. Write a program that lets the user enter a word and then output all the words contained in the file words.txt that can be formed from the letters of the entered word. One algorithm to do this is to compare the letter histograms for each word. Create an array that counts up the number of each letter in the entered word (e.g., one S, one W, two I, two M, etc.) and then creates a similar array for the current word read from the file. The two arrays can be compared to see if the word from the file could be created out of the letters from the entered word.


TextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbookTextbook

Answer

PROGRAM CODE:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class WordGame {
    // Method to create a letter histogram for a given word
    private static Map<Character, Integer> createLetterHistogram(String word) {
        Map<Character, Integer> letterHistogram = new HashMap<>();
        for (char ch : word.toCharArray()) {
            letterHistogram.put(ch, letterHistogram.getOrDefault(ch, 0) + 1);
        }
        return letterHistogram;
    }

    // Method to check if a word can be formed using the letters of another word
    private static boolean canFormWord(String mainWord, String word) {
        Map<Character, Integer> mainWordHistogram = createLetterHistogram(mainWord);
        Map<Character, Integer> wordHistogram = createLetterHistogram(word);

        for (char ch : wordHistogram.keySet()) {
            if (!mainWordHistogram.containsKey(ch) || mainWordHistogram.get(ch) < wordHistogram.get(ch)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in);
             BufferedReader reader = new BufferedReader(new FileReader("words.txt"))) {

            // Get the user-entered word
            System.out.print("Enter a word: ");
            String mainWord = scanner.nextLine().toUpperCase();

            // Read words from the file and check if they can be formed from the user-entered word
            System.out.println("Words that can be formed using the letters of the entered word:");
            String word;
            while ((word = reader.readLine()) != null) {
                word = word.toUpperCase();
                if (canFormWord(mainWord, word)) {
                    System.out.println(word);
                }
            }
        } catch (IOException e) {
            System.err.println("Error reading the file: " + e.getMessage());
        }
    }
}

 

OUTPUT:

Enter a word: SWIMMING
Words that can be formed using the letters of the entered word:
IM
MIM
MIMING
MIS
SING
SWIM
WIN
WING

 

0 0

Discussions

Post the discussion to improve the above solution.