随笔 - 19  文章 - 0  评论 - 0  阅读 - 602

递归与回溯_正则问题()|x

acwing 1225 正则问题(递归回溯)

考虑一种简单的正则表达式:

只由 x ( ) | 组成的正则表达式。

小明想求出这个正则表达式能接受的最长字符串的长度。

例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。

思路:遇到 '(' '|' 就进行递归,遇到 ')' 就进行回溯,每次递归 dfs() 计算的是该次递归所遇到的所有 '*' 的数目

注意:由于是对字符串进行递归,每次遇到一个符号都要进行索引指针+1,但是可能由 '|' 进行多次的递归调用,而在一个 ')' 处回溯,
所以在 ')' 处不能进行索引指针的自增(因为可能会自增好多次),正确的应该是由对应递归的发起者进行负责回溯点的索引指针的自增。

#include<iostream>

using namespace std;
string str;
int k=0;

int dfs()
{
    int n=str.size();
    int res=0;
    while(k<n)
    {
        if(str[k]=='(')
        {
            k++;
            res+=dfs();
            k++;
        }
        else if(str[k]=='|')
        {
            k++;
            res=max(res,dfs());
        }
        else if(str[k]==')')
        {
            //k++;
            break;
        }
        else 
        {
            res++,k++;
        }
    }
    return res;
}

int main()
{
    cin>>str;
    cout<<dfs();
}
posted on   rain_wind_read  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示