Как посчитать количество слов, которое можно собрать из введенной строки? 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
→ Ссылка
- Создать карту частоты букв во введённом слове -- в общем случае это должна быть
Map<Character, Integer>, но в данном случае может хватить массива для запоминания частот 26 английских букв. - Аналогично вычислить карту частот каждого слова
wordв массивеstr - Сравнить частоты, увеличить счётчик слов если частоты всех букв в слове
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++;
} // и т.д.