1. 程式人生 > >藍橋杯-正則表示式

藍橋杯-正則表示式

參考

當我們需要同時考慮“()”和“|”時,我們發現“()”括號的作用就是講上面的程式碼限定了一個範圍,所以我們只需要讓這段程式碼從一個“(”開始執行到一個“)”為止。

那麼怎麼才能做到這種控制呢?

我們可以分析一下樣例的計算過程。


在遇到一個括號時,我們會先終止當前的計算,進入到括號裡進行計算,當這一次計算結束後,我們返回這個結果繼續計算。

這是一個和深搜回溯很相似的過程(還記得第四題嗎)。

所以我們用深搜的方式來完成計算。在遇到一對“()”時,我們就進入一個新的函式,然後用這個函式的返回值繼續計算。

#include <iostream>
#include <string>
using namespace std;
string str;
int pos, len;
int dfs() {
    int num = 0, res = 0;
    while (pos < len) {
        if (str[pos] == '(') {
            pos++;
            num += dfs();
        }
        else if (str[pos] == ')') {
            pos++;
            break;
        }
        else if (str[pos] == '|') {
            pos++;
            res = max(num, res);
            num = 0;
        }
        else {
            pos++;
            num++;
        }
    }
    res = max(num, res);
    return res;
}
int main() {
    cin >> str;
    int ans = 0;
    len = str.length(), pos = 0;
    ans = dfs();
    cout << ans << endl;
    return 0;
}