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;
}