Blue Bridge Cup Daily One Question 1.9 Compétition provinciale 2017 Groupe A 7. Problème régulier [DFS Recursive Imitation Stack]

Description du titre

http://oj.ecustacm.cn/problem.php?id=1321


  Une expression régulière simple: une expression régulière constituée uniquement de x () |.
  Xiao Ming veut trouver la longueur de la chaîne la plus longue que cette expression régulière peut accepter.
  Par exemple ((xx | xxx) x | (x | xx)) xx La chaîne la plus longue qui peut être acceptée est: xxxxxx, la longueur est de 6


Explication:
  Les expressions régulières, également appelées expressions régulières, sont généralement utilisées pour récupérer et remplacer du texte qui répond à un certain modèle (règle).
  Par exemple, pour l'expression régulière composée de x () | dans le titre, la parenthèse "()" a la priorité la plus élevée, ou l'opération "|" prend la deuxième place. À l'intérieur des supports se trouve un tout, ou gardez le plus long des deux côtés .
   ((xx | xxx) x | (x | xx)) Comment xx est-il exécuté et pourquoi est-il 6?
  Exécutez d'abord les parenthèses, puis exécutez le ou. Les étapes sont les suivantes:
  (1) Regardez la première parenthèse et trouvez qu'il y a des parenthèses imbriquées à l'intérieur. Trouvez la parenthèse la plus profonde. À l'intérieur des parenthèses se trouve une opération OR. ( (xx | xxx) x | (x | xx)) xx, obtenez: ( xxx x | (x | xx)) xx
  (2) Continuez à exécuter le crochet le plus interne. (xxxx | (x | xx) ) xx, get: (xxxx | xx ) xx
  (3) Continuez à exécuter le dernier crochet. (xxxx | xx) xx, get: xxxx xx, end, récupère une chaîne de longueur 6.
  Tutoriel d'expression régulière: https://www.runoob.com/regexp/regexp-tutorial.html , il est livré avec son propre outil de test.

répondre:

https://blog.csdn.net/weixin_43914593/article/details/112363933

Les mots de Ni Wendi: "Ce problème est fait avec une idée récursive, et le code est assez concis. Lorsque vous rencontrez un crochet gauche '(', allez à la solution récursive, lorsque vous rencontrez un crochet droit ')', la récursivité actuelle se termine et le résultat est renvoyé; | 'puis enregistrez et réinitialisez la valeur actuelle, puis calculez et mettez à jour vers la droite; si c'est x, comptez directement. "

while (pos <len) {

        if (s [pos] == '(') {// Parenthèse gauche, continuez la récursivité. Cela équivaut à l'empilement

            pos ++;

            tmp + = dfs ();

        } else if (s [pos] == ')') {// Ferme les parenthèses, retourne récursivement. Égal à pop

            pos ++;

            pause ;

        } else if (s [pos] == '|') {// vérifier ou

            pos ++;

            ans = max(ans, tmp);

            tmp = 0;

        } else {// Vérifiez X et comptez le nombre de X

            pos ++;

            tmp ++;

        }

    }

    ans = max(ans, tmp);

    return ans; 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 110000;

string s;
int pos=0;//字符串当前指针

int dfs()
{
    int maxx=0;
    int ans=0;
    int len=s.size();
    while(pos<len)
    {
        if(s[pos]=='(')
        {
            pos++;
            maxx+=dfs();//模仿入栈,继续递归
        }
        else if(s[pos]==')')
        {
            pos++;
            break;//模仿出栈,结束循环
        }
        else if(s[pos]=='|')
        {
            pos++;
            ans=max(ans,maxx);//取得最大X,为了统计|之后的X的数量,maxx清零
            maxx=0;
        }
        else if(s[pos]=='x')
        {
            pos++;
            maxx++;//统计X个数
        }
    }
    ans=max(ans,maxx);
    return ans;//返回本层递归最大X个数
}

int main()
{
    cin>>s;
    cout<<dfs();
    return 0;
}


 

Je suppose que tu aimes

Origine blog.csdn.net/qq_43660826/article/details/112984762
conseillé
Classement