Aller au contenu
  1. Algorithmes & Structures de données/
#23 Hashing Facile 2 min de lecture

Ransom Note

Peux-tu écrire le mot ransomNote en découpant des lettres du texte magazine ? Chaque lettre du magazine ne peut servir qu’une fois. Renvoie true/false.

🐻 Vocabulaire pas clair ? Consultez le glossaire algo.

C’est quoi le problème, en clair ? #

Vous avez un texte de magazine et vous voulez découper des lettres dedans (chacune une seule fois) pour composer un mot de demande de rançon — la question est simplement : y a-t-il assez de chaque lettre dans le magazine pour écrire le mot voulu ? C’est comme vérifier si vous avez assez de lettres de Scrabble dans votre sac pour former un mot donné : on compte d’abord combien de chaque lettre on a en stock, puis on les « dépense » une par une pour écrire le mot voulu, et si jamais il en manque une, c’est impossible.

L’idée clé #

Problème de STOCK de lettres : on compte les lettres disponibles dans magazine, puis on « consomme » celles de ransomNote. Si un compteur passe en négatif, il manque une lettre → false.

Pourquoi cette solution ? #

int[26] comme pour Valid Anagram : comptage direct, pas de HashMap nécessaire pour un alphabet fixe. Ce pattern « histogramme de fréquences » est la brique de base d’une dizaine de problèmes de chaînes (anagrammes, fenêtres, permutations).

Solution Java #

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] stock = new int[26]; // lettres disponibles

        // 1. Remplir le stock avec les lettres du magazine
        for (char c : magazine.toCharArray()) {
            stock[c - 'a']++;
        }

        // 2. Consommer les lettres necessaires a la note
        for (char c : ransomNote.toCharArray()) {
            if (--stock[c - 'a'] < 0) {
                return false; // lettre epuisee : impossible
            }
        }
        return true;
    }
}

Complexité #

Temps O(M + R) : une passe sur chaque chaîne. Espace O(1) : 26 compteurs fixes.