Problème de correspondance entre supports : application intelligente de l'optimisation de la pile et du code [pile, optimisation, table de hachage]

Lors de la résolution de problèmes algorithmiques, une utilisation flexible des structures de données est cruciale. Dans ce problème, nous devons déterminer si une chaîne contenant uniquement des crochets est valide, c'est-à-dire si les crochets peuvent correspondre et se fermer correctement. Ce problème peut être bien résolu en utilisant cette structure de données.

Lien vers la question : parenthèses valides

Idées de résolution de problèmes : pourquoi utiliser une pile ?

Le problème de correspondance des parenthèses nécessite de déterminer si les parenthèses dans la chaîne d'entrée sont correctement fermées et l'ordre des parenthèses doit également être correct. Dans ce cas, nous pouvons utiliser 堆栈.

La pile est une 后进先出(LIFO)structure de données très adaptée pour résoudre les problèmes de correspondance entre parenthèses.

Lorsque nous rencontrons un support gauche , nous 压入l'empilons, et lorsque nous rencontrons un support droit , nous pouvons 弹出empiler l'élément supérieur et comparer pour une correspondance.

code d'origine

Tout d’abord, examinons le code de la solution originale :

class Solution {
    
    
public:
    bool isValid(string ex) {
    
    
        stack<char> s;
        for(char c : ex){
    
    
            if(c == '(' || c == '[' || c == '{'){
    
    
                s.push(c);
            }else{
    
    
                if(s.empty()){
    
    
                    return false;
                }else{
    
    
                    if(c == ')' && s.top() == '('){
    
    
                        s.pop();
                    }
                    else if(c == '}' && s.top() == '{'){
    
    
                        s.pop();
                    }
                    else if(c == ']' && s.top() == '['){
    
    
                        s.pop();
                    }
                    else {
    
    
                        return false;
                    }
                }
            }
        }
        return s.empty();
    }
};

code optimisé

Afin de simplifier la logique et d'améliorer la lisibilité du code, on peut utiliser une table de hachage pour stocker la correspondance entre parenthèses et l'améliorer en conjonction avec les opérations de base de la pile :

class Solution {
    
    
public:
    bool isValid(string s) {
    
    
        stack<char> st;
        unordered_map<char, char> mapping = {
    
    
            {
    
    ')', '('},
            {
    
    ']', '['},
            {
    
    '}', '{'}
        };
        
        for (char c : s) {
    
    
            if (c == '(' || c == '[' || c == '{') {
    
    
                st.push(c);
            } else {
    
    
                if (st.empty() || st.top() != mapping[c]) {
    
    
                    return false;
                }
                st.pop();
            }
        }
        
        return st.empty();
    }
};

Conseils pour utiliser les opérations de base de la pile

Pour résoudre ce problème, nous avons pleinement utilisé les opérations de base de la pile :

  1. push: Poussez le support gauche sur la pile.
  2. pop: Lorsqu'un support droit est rencontré, retirez-le de la pile et comparez-le avec le support droit actuel pour voir s'il correspond.
  3. top: Vérifiez si l'élément supérieur de la pile correspond au support droit actuel.

Ces opérations nous permettent de vérifier efficacement si les parenthèses correspondent.

Résumé et réflexion

Le problème de correspondance entre parenthèses est un problème typique résolu à l’aide de la pile. En poussant la parenthèse gauche sur la pile, puis en effectuant une correspondance pop lorsque la parenthèse droite correspondante est rencontrée, nous pouvons déterminer efficacement si la parenthèse est fermée correctement.

Le code original faisait son travail, mais existait 冗长的 if-else 语句et n’était pas assez élégant. En utilisant 哈希表la correspondance entre parenthèses stockée, nous pouvons accomplir la même fonction avec un code plus concis, améliorant ainsi la lisibilité et la maintenabilité du code.

Le problème de correspondance entre parenthèses n'est qu'une petite application de la pile dans les algorithmes. La pile a de nombreuses autres utilisations puissantes, telles que l'évaluation inverse des expressions polonaises , la recherche en profondeur d'abord , etc. Maîtriser les opérations de base et les applications flexibles de la pile est très utile pour améliorer votre compréhension des algorithmes et des structures de données.

Je suppose que tu aimes

Origine blog.csdn.net/qq_22841387/article/details/132218686
conseillé
Classement