← Static tasks

1002. Find Common Characters

leetcode easy

#array#csharp#easy#leetcode#math#search#string

Task

Если задан массив строк words, верните массив всех символов, которые встречаются во всех строках внутри слов (включая дубликаты). Вы можете вернуть ответ в любом порядке.

Пример:

Input: words = ["bella","label","roller"]

Output: ["e","l","l"]

C# solution

matched/original
public class Solution {
    public IList<string> CommonChars(string[] words) {
        int[] minFreq = new int[26];
        Array.Fill(minFreq, int.MaxValue);
        
        foreach (string word in words) {
            int[] freq = new int[26];
            foreach (char c in word) {
                freq[c - 'a']++;
            }
            for (int i = 0; i < 26; i++) {
                minFreq[i] = Math.Min(minFreq[i], freq[i]);
            }
        }
        
        IList<string> result = new List<string>();
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < minFreq[i]; j++) {
                result.Add(((char)('a' + i)).ToString());
            }
        }
        return result;
    }
}

C++ solution

auto-draft, review before submit
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public vector<string> CommonChars(vector<string> words) {
        vector<int>& minFreq = new int[26];
        Array.Fill(minFreq, int.MaxValue);
        
        foreach (string word in words) {
            vector<int>& freq = new int[26];
            foreach (char c in word) {
                freq[c - 'a']++;
            }
            for (int i = 0; i < 26; i++) {
                minFreq[i] = min(minFreq[i], freq[i]);
            }
        }
        
        vector<string> result = new List<string>();
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < minFreq[i]; j++) {
                result.push_back(((char)('a' + i)).ToString());
            }
        }
        return result;
    }
}

Java solution

matched/original
public class Solution {
    public List<String> commonChars(String[] words) {
        int[] minFreq = new int[26];
        Arrays.fill(minFreq, Integer.MAX_VALUE);
        
        for (String word : words) {
            int[] freq = new int[26];
            for (char c : word.toCharArray()) {
                freq[c - 'a']++;
            }
            for (int i = 0; i < 26; i++) {
                minFreq[i] = Math.min(minFreq[i], freq[i]);
            }
        }
        
        List<String> result = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < minFreq[i]; j++) {
                result.add(Character.toString((char)('a' + i)));
            }
        }
        return result;
    }
}

JavaScript solution

matched/original
class Solution {
    commonChars(words) {
        const minFreq = new Array(26).fill(Infinity);
        
        for (const word of words) {
            const freq = new Array(26).fill(0);
            for (const char of word) {
                freq[char.charCodeAt() - 97]++;
            }
            for (let i = 0; i < 26; i++) {
                minFreq[i] = Math.min(minFreq[i], freq[i]);
            }
        }
        
        const result = [];
        for (let i = 0; i < 26; i++) {
            for (let j = 0; j < minFreq[i]; j++) {
                result.push(String.fromCharCode(97 + i));
            }
        }
        return result;
    }
}

Explanation

Algorithm

Инициализация частотного массива:

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

Обработка каждого слова:

Для каждого слова создайте временный массив для хранения частоты каждого символа в этом слове.

Обновите основной частотный массив, сравнивая его с временным массивом и сохраняя минимальные частоты каждого символа.

Формирование результата:

Создайте результирующий массив, добавляя каждый символ столько раз, сколько его минимальная частота.

😎