Ümumi simvollar üçün kod kodu həllini tapın

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Çiy kərpic Amazon alma Bloomberg google microsoft TripAdvisor Über
alqoritmlər Geyim kodlaşdırma Hashing müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 32

Problem bəyanat

Bu problemdə bizə bir array of strings. Dizidəki hər sətirdə görünən bütün simvolların siyahısını çap etməliyik (dublikatlar daxil edilmişdir). Yəni bir simvol hər sətirdə 2 dəfə görünür, lakin 3 dəfə deyilsə, nəticədə 2 dəfə olmalıyıq.

Diqqət yetirin ki, simvoldakı hər bir simvol kiçik bir İngilis hərfidir və simvollar maksimum 100 uzunluğa malikdir.

misal

String_Array = {"bella" , "ciao" , "espanol"}
a
String_Array = {"qweerty" , "weerty" , "eerty"}
e e r t y

 

Ümumi simvollar üçün kod kodu həllini tapınPin

Yanaşma (HashMaps)

Əvvəlcə bir hashmap istifadə edə bilərik finalSayı ['a', 'z'] arasında dəyişən simvol saylarını saxlamaq üçün minimum ümumi bütün simlərdə varlıq. Məsələn, sıra içindəki hər bir sətirdə 2 'e olduğunu tapsaq, sayını 2 olaraq saxlayırıq. Buna nail olmaq üçün sıra içindəki hər bir sətri ziyarət edib minimuma endiririk. finalSayı ['a', 'z'] hər bir xarakter üçün. Nəhayət, bir nəticə massivində / siyahıda son sayına görə bir xarakteri itələyirik və geri qaytarırıq.

Alqoritm

  1. Bir hash xəritəsi başlatın finalSayı hər xarakterin minimum ümumi görünüşünü saxlamaq
  2. Hər kiçik ingilis hərfləri üçün:
    • Bunları seçin finalSayı kimi 100.
  3. Hər tel üçün söz verilmiş massivdə:
    • Hər simvol sayını bir hash xəritəsində saxlayın saymaq
    • Hər kiçik ingilis hərfi üçün c:
      • Set: finalCount [c] = dəqiqə (finalCount [c], count [c])
  4. Bir siyahını / serialı başladın nəticələnəcək ümumi simvollar massivini saxlamaq.
  5. Hər bir xarakter üçün ['a', 'z'] aralığında:
    • Siyahıya neçə dəfə əlavə edin finalCount [c]
  6. Nəticəni çap edin

Ümumi simvolları tapın Leetcode həllinin tətbiqi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

vector <string> commonChars(vector <string> A)
{
    unordered_map <char , int> finalCount;

    for(char c = 'a' ; c <= 'z' ; ++c)
        finalCount[c] = 100;

    unordered_map <char , int> count;

    for(string &word : A)
    {
        count.clear();
        for(char c : word)
            count[c]++;

        for(char c = 'a' ; c <= 'z' ; ++c)
            finalCount[c] = min(finalCount[c] , count[c]);
    }

    vector <string> result;

    string temp;

    int times;
    for(char c = 'a' ; c <= 'z' ; ++c)
    {
        times = finalCount[c];
        temp = c;
        while(times > 0)
        {
            result.push_back(temp);
            --times;
        }
    }
    return result;
}

int main()
{
    vector <string> A = {"qweerty" , "weerty" , "eerty"};
    vector <string> result = commonChars(A);
    if(result.empty())
        cout << "No common characters\n";
    else
    {
        for(string &s : result)
            cout << s << " ";
    }

    return 0;
}

Java Proqramı

import java.util.*;
import java.lang.*;

class common_chars
{
    public static void main(String args[])
    {
        String[] A = {"qweerty" , "weerty" , "eerty"};
        List <String> result = commonChars(A);
        if(result.size() == 0)
            System.out.println("No common characters");
        else
        {
            for(String s : result)
                System.out.print(s + " ");
        }
    }

    static List <String> commonChars(String[] A)
    {
        HashMap <Character , Integer> finalCount = new HashMap<>();

        for(char c = 'a' ; c <= 'z' ; ++c)
            finalCount.put(c , 100);

        HashMap <Character , Integer> count = new HashMap<>();
        for(String word : A)
        {
            count.clear();
            for(char c : word.toCharArray())
                count.put(c , count.getOrDefault(c , 0) + 1);

            for(char c = 'a' ; c <= 'z' ; ++c)
                finalCount.put(c , Math.min(finalCount.get(c) , count.getOrDefault(c , 0)));
        }

        List <String> result = new ArrayList<>();

        int times;
        for(char c = 'a' ; c <= 'z' ; ++c)
        {
            times = finalCount.get(c);
            while(times > 0)
            {
                result.add(Character.toString(c));
                --times;
            }
        }
        return result;
    }
}
e e r t y

Ümumi simvolları tapın Leetcode həllinin mürəkkəbliyi təhlili

Zamanın mürəkkəbliyi

O (N) simvol sayını yeniləmək üçün serialdakı hər sətrin tək keçidini etdikdə. N = Dizidəki simlərin uzunluqlarının cəmi.

Kosmik Mürəkkəblik

O (1) simvol saylarını saxlamaq üçün daimi yaddaş boşluğundan istifadə etdiyimiz üçün.

Şərh yaz

Translate »
1