演算法 正規表示式匹配

2021-10-23 21:44:59 字數 2462 閱讀 2083

單純做個記錄~

題目會給我們輸入兩個字串sps代表文字,p代表模式串,請你判斷模式串p是否可以匹配文字s

正則表達演算法問題只需要把住乙個基本點:看兩個字元是否匹配,一切邏輯圍繞匹配/不匹配兩種情況展開即可。

動態規劃演算法的核心就是「狀態」和「選擇」,「狀態」無非就是ij兩個指標的位置,「選擇」就是p[j]選擇匹配幾個字元

dp函式的定義如下:

dp(s,i,p,j) = true,則表示s[i,i+1,...,m-1]可以匹配p[j,j+1,...,n-1]

dp(s,i,p,j) = false,則表示s[i,i+1,...,m-1]無法匹配p[j,j+1,...,n-1]

簡單版本(無memory)

#include#includeusing namespace std;

bool dp(string &s, int i, string &p, int j)

if (i == m)

for (; j + 1 < n; j += 2)

} return true;

} //狀態選擇

if (s[i] == p[j] || p[j] == '.')

else

} else

else

} return res;

}bool ismatch(string s, string p)

int main()

} return 0;

}

改進版本 

加入mapmemo,消除重疊子問題

#include#include#includeusing namespace std;

mapmemo;

/* 計算 p[j..] 是否匹配 s[i..] */

bool dp(string& s, int i, string& p, int j)

if (i == m)

for (; j + 1 < n; j += 2)

} return true;

} // 記錄狀態 (i, j),消除重疊子問題

cout << i << "," << j << endl;

string key = to_string(i) + "," + to_string(j);

if (memo.count(key)) return memo[key];

bool res = false;

if (s[i] == p[j] || p[j] == '.')

else

} else

else

} // 將當前結果記入備忘錄

memo[key] = res;

return res;

}bool ismatch(string s, string p)

int main()

for (auto iter = memo.begin(); iter != memo.end(); iter++)

}

**中用了乙個雜湊表memo消除重疊子問題,因為正則表達演算法的遞迴框架如下:

bool dp(string& s, int i, string& p, int j)
那麼,如果讓你從dp(s, i, p, j)得到dp(s, i+2, p, j+2),至少有兩條路徑:1 -> 2 -> 23 -> 3,那麼就說明(i+2, j+2)這個狀態存在重複,這就說明存在重疊子問題。

動態規劃的時間複雜度為「狀態的總數」*「每次遞迴花費的時間」,本題中狀態的總數當然就是ij的組合,也就是m * nms的長度,np的長度);遞迴函式dp中沒有迴圈(base case 中的不考慮,因為 base case 的觸發次數有限),所以一次遞迴花費的時間為常數。二者相乘,總的時間複雜度為o(mn)

空間複雜度很簡單,就是備忘錄memo的大小,即o(mn)

正規表示式匹配演算法

看 之美 之美中有個簡短而高效的正規表示式匹配演算法,這裡給一下簡單的實現,供學習使用。include include includeusing namespace std int match char regexp,char text int matchhere char regexp,char ...

演算法 正規表示式匹配

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...

演算法 正規表示式匹配。

給你乙個字串s和乙個字元規律p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。輸入 s aa p a 輸出 false解釋 a 無法匹配 aa 整個字串。輸入 s aa p a 輸出 true 解釋 ...