Посчитайте частоты 26 букв в каждом слове и возьмите минимум для каждой буквы по всем словам. В результат добавьте букву ровно минимальное число раз.
Определение общих букв в наборе слов
Посчитайте частоты 26 букв в каждом слове и возьмите минимум для каждой буквы по всем словам. В результат добавьте букву ровно минимальное число раз.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан массив строк words. Необходимо реализовать метод, который возвращает список символов, встречающихся во всех строках массива, учитывая их количество.
Пример 1: Вход: ["bella", "label", "roller"] Выход: ["e", "l", "l"]
Пример 2: Вход: ["cool", "lock", "cook"] Выход: ["c", "o"]
Ограничения:
- 1 ≤
words.length≤ 100 - 1 ≤
words[i].length≤ 100 words[i]состоит только из строчных английских букв
class Solution {
public List<String> commonChars(String[] words) {
}
}
Ответ
Посчитайте частоты 26 букв в каждом слове и возьмите минимум для каждой буквы по всем словам. В результат добавьте букву ровно минимальное число раз.
public List<String> commonChars(String[] words) {
int[] minimum = new int[26];
java.util.Arrays.fill(minimum, Integer.MAX_VALUE);
for (String word : words) {
int[] count = new int[26];
for (int i = 0; i < word.length(); i++) count[word.charAt(i)-'a']++;
for (int i = 0; i < 26; i++) minimum[i] = Math.min(minimum[i], count[i]);
}
List<String> result = new java.util.ArrayList<>();
for (int i = 0; i < 26; i++)
for (int j = 0; j < minimum[i]; j++) result.add(String.valueOf((char)('a'+i)));
return result;
}
Условие гарантирует хотя бы одно слово и только a–z. Время O(суммы длин + 26·числа слов), рабочая память O(26) без результата. Множество букв потеряло бы повторяющуюся l.