正则问题

正则问题

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

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

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

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

输入格式

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

输出格式

输出所给正则表达式能接受的最长字符串的长度。

数据范围

输入长度不超过100,保证合法。

输入样例:

((xx|xxx)x|(x|xx))xx

输出样例:

6

 

解题思路

  我到现在都不明白为什么这题用递归做。

  这个正则表达式的逻辑对应一颗二叉树。

  树中有两种符号:

  1. '|':两者取其一。
  2. '&':链接两个字符串。

  这些符号都是每棵子树的根节点,而'x'为叶子结点。

  AC代码如下:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int N = 110;
 7 
 8 string str;
 9 int k;
10 
11 int dfs() {
12     int ret = 0;
13     while (k < str.size()) {
14         if (str[k] == '(') {    // 处理(......)
15             k++;    // 跳过'('
16             ret += dfs();
17             k++;    // 跳过')'
18         }
19         else if (str[k] == ')') {
20             break;
21         }
22         else if (str[k] == '|') {
23             k++;    // 跳过'|'
24             ret = max(ret, dfs());
25         }
26         else {
27             k++;    // 跳过'x'
28             ret++;
29         }
30     }
31     
32     return ret;
33 }
34 
35 int main() {
36     cin >> str;
37     cout << dfs();
38     
39     return 0;
40 }

 

参考资料

  AcWing 1225. 正则问题(蓝桥杯C++ AB组辅导课):https://www.acwing.com/video/768/

posted @ 2022-03-06 20:49  onlyblues  阅读(97)  评论(0编辑  收藏  举报
Web Analytics