タイトル説明
http://oj.ecustacm.cn/problem.php?id=1321
単純な正規表現:x()|のみで構成される正規表現。
Xiao Mingは、この正規表現が受け入れることができる最長の文字列の長さを見つけたいと考えています。
例:((xx | xxx)x |(x | xx))xx受け入れ可能な最長の文字列は、xxxxxx、長さは6です。
説明:
正規表現は、通常、正規表現とも呼ばれ、特定のパターン(ルール)を満たすテキストを取得して置換するために使用されます。
たとえば、タイトルにx()|で構成される正規表現の場合、括弧「()」が最も優先度が高くなるか、操作「|」が2番目になります。ブラケットの内側は全体であるか、両側で最も長いものを保持します。
((xx | xxx)x |(x | xx))xxはどのように実行され、なぜ6なのですか?
最初に括弧を実行してから、またはを実行します。手順は次のとおりです。
(1)最初の括弧を見て、中にネストされた括弧があることを確認します。最も内側の括弧を見つけます。括弧の中にはOR演算があります。((xx | xxx) x |(x | xx))xx、get:(xxx x |(x | xx))xx
(2)最も内側のブラケットを実行し続けます。(xxxx | (x | xx))xx、get:(xxxx | xx)xx
(3)最後の角かっこを実行し続けます。(xxxx | xx) xx、get:xxxx xx、end、長さ6の文字列を取得します。
正規表現チュートリアル:https://www.runoob.com/regexp/regexp-tutorial.html、独自のテストツールが付属しています。
回答:
https://blog.csdn.net/weixin_43914593/article/details/112363933
Ni Wendiの言葉:「この問題は再帰的なアイデアで行われ、コードは非常に簡潔です。左角かっこ '('、右角かっこ ')'に遭遇すると、現在の再帰は終了します。結果が返されます; | '次に、現在の値を記録してリセットし、計算して右側に更新します。xの場合は、直接カウントします。 "
while(pos <len){
if(s [pos] == '('){//左括弧、再帰を続行します。これはスタッキングと同等です。
pos ++;
tmp + = dfs();
} else if(s [pos] == ')'){//括弧を閉じ、再帰的に返します。ポップに等しい
pos ++;
休憩;
} else if(s [pos] == '|'){//チェックまたは
pos ++;
ans = max(ans、tmp);
tmp = 0;
} else {// Xをチェックし、Xの数を数える
pos ++;
tmp ++;
}
}
ans = max(ans、tmp);
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;
}