正则表达式匹配C++代码实现
正則表達式匹配的解決需要用到遞歸和動態規劃的知識。
遞歸和動態規劃之間是有密切的聯系的。動態規劃的實質就是帶有緩存區的遞歸。
?
遞歸實現階乘。
#include <iostream>using namespace std;//計算階乘的函數long CalcJiecheng(int num){int res = 0;if (1== num) //邊界條件{res = 1;}if (num>1) //遞歸公式{res = num*CalcJiecheng(num-1);}return res;}int main(){long res = CalcJiecheng(5);cout<<"5的階乘:"<<res<<endl;system("pause");return 0;}動態規劃會有一個狀態轉移方程來存取每次遞歸調用的狀態值,這樣算法的效率會有所提高,就會省去很多的重復計算。
動態規劃算法的難點在于 從實際問題中抽象出動態規劃表dp,dp一般是一個數組,可能是一維的也可能是二維的,也可能是其他的數據結構:整個求解過程就可以用一個最優決策表來描述,最優決策表可以是一個二維表,其中行表示決策的階段,列表示問題狀態,表格需要填寫的數據一般對應此問題的在某個階段某個狀態下的最優值(如最短路徑,最長公共子序列,最大價值等),填表的過程就是根據遞推關系,從1行1列開始,以行或者列優先的順序,依次填寫表格,最后根據整個表格的數據通過簡單的取舍或者運算求得問題的最優解:
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}
————————————————
版權聲明:本文為CSDN博主「MISAYAONE」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/misayaaaaa/article/details/71940779
遞歸調用最簡單也是最經典的例子就是臺階問題。
有n級臺階,一個人每次上一級或者兩級,問有多少種走完n級臺階的方法?
n階臺階,只可能是從n-1或是n-2的臺階上走上來的,臺階n的階段依賴的是n-1和n-2的子階段,所以狀態轉移方程為dp[n] = dp[n-1] + dp[n-2],屬于最簡單的動態規劃問題
#include <iostream>#define N 20 //臺階數為20using namespace std;int dp[N]; //全局數組,存放決策表int fun(int n) //返回臺階數為n的走法{if (n == 1 || n == 2){return n;}dp[n-1] = fun(n-1); //若不為1或2則進行遞歸計算dp[n-2] = fun(n-2);dp[n] = dp[n-1]+dp[n-2]; //狀態轉移方程return dp[n];}int main(int argc,char** argv){fun(N);cout<<dp[15]<<endl; //輸出15階的走法system("pause");return 0;}鋪墊完畢,言歸正傳。
在匹配字符的過程中需要分類討論。如果p中有.字符,那么很好辦,因為它是萬能字符,我們直接跳過就可以,在程序中就是直接判為1.如果P中有*號可能就會麻煩些。我們需要重點討論下帶*和不帶*的情況。不帶*號也好辦,只要和s中的字符逐一對比就行。如果帶字符*就需要分兩種情況。見圖
?
?
?
分析完畢上代碼?
?
class Solution {public:bool isMatch(string s,string p){return isMatch(s.c_str(),p.c_str());}bool isMatch(const char*s,const char *p){if(*p==0)return *s==0;auto first_match=*s&&(*s==*p||*p=='.');if(*(p+1)=='*'){return isMatch(s,p+2)||(first_match && isMatch(++s,p));}else {return first_match && isMatch(++s,++p);}}} ;?
總結
以上是生活随笔為你收集整理的正则表达式匹配C++代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: appium显示无法连接到服务器,App
- 下一篇: 短板效应C++代码实现