Как посчитать количество слов, которое можно собрать из введенной строки? Java

Есть массив:

["anger", "awe", "joy", "love", "grief"]

Пользователь вводит строку через Scanner, которая состоит из набора букв.

Необходимо вывести на экран количество слов из массива, которые можно собрать из букв введенной строки.

Каждую букву в строке можно задействовать только один раз для одного слова, но можно использовать для другого слова (например, одна буква 'е' может быть использована для составления 5 слов из массива).

Пример рандомного ввода текста через Scanner:

"yliausoenvjw" == можно сложить 3 слова 
"angerw" == можно сложить 2 слова
"griefgriefgrief" ==  можно сложить 1 слово
"abcdkasdfvkadf" == можно сложить 0 слов
String[] str = {"anger", "awe", "joy", "love", "grief"};
char[] convert;
String input = scanner(); // Метод с вызовом сканера
char[] letters = input.toCharArray(); // Конвертнул String в char
                
for (int i = 0; i < str[0].length(); i++) { 
    // Цикл конвертирует массив String str в массивы char
    convert = str[i].toCharArray();
                       
    for (int j = 0; j < letters.length; j++) { 
        if (letters[j] == convert[i]) {
        // Как дальше можно правильно написать цикл для подсчета и проверки совпадений букв?
        }
    }
}

Ответы (2 шт):

Автор решения: Alex Rudenko
  1. Создать карту частоты букв во введённом слове -- в общем случае это должна быть Map<Character, Integer>, но в данном случае может хватить массива для запоминания частот 26 английских букв.
  2. Аналогично вычислить карту частот каждого слова word в массиве str
  3. Сравнить частоты, увеличить счётчик слов если частоты всех букв в слове word меньше соответствующих частот во входном слове

Вариант реализации

// метод для вычисления частот букв в слове
static int[] getFreqMap(String word) {
    int[] freq = new int[26];
    for (char c : word.toLowerCase().toCharArray) {
        if (Character.isLetter(c)) {
            freq[c - 'a']++;
        }
    }
    return freq;
}
int[] inputFreq = getFreqMap(input);
int count = 0;
for (String word : str) {
    int[] wordFreq = getFreqMap(word);
    boolean ok = true;
    for (int i = 0; ok && i < inputFreq.length; i++) {
        if (wordFreq[i] > inputFreq[i]) {
            ok = false;
        }
    }
    if (ok) {
        count++;
    }
}
System.out.println(count);
→ Ссылка
Автор решения: Volodia Sachenko

Решил все сделать с помощью подсчета на совпадения букв и одного цикла, и все заработало:

private static void charCheck(char[] letters) { // Проверка на совпадения
            int a = 0, n = 0, g = 0, e = 0, r = 0, w = 0, j = 0, o = 0, y = 0, l = 0, v = 0, i = 0, f = 0; // Подсчет ввода со сканера
            int counter = 0;               
            for (char letter : letters) { 
                if (letter == 'a') { 
                    a++;
                } // и т.д.

    if (a >= 1 && n >= 1 && g >= 1 && e >= 1 && r >= 1) { // Проверка на слово
                System.out.println("anger");
                counter++;
            } // и т.д.
               
→ Ссылка