日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

正则表达式匹配C++代码实现

發(fā)布時(shí)間:2025/3/15 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则表达式匹配C++代码实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正則表達(dá)式匹配的解決需要用到遞歸和動(dòng)態(tài)規(guī)劃的知識(shí)。

遞歸和動(dòng)態(tài)規(guī)劃之間是有密切的聯(lián)系的。動(dòng)態(tài)規(guī)劃的實(shí)質(zhì)就是帶有緩存區(qū)的遞歸。

?

遞歸實(shí)現(xiàn)階乘。

#include <iostream>using namespace std;//計(jì)算階乘的函數(shù)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;}

動(dòng)態(tài)規(guī)劃會(huì)有一個(gè)狀態(tài)轉(zhuǎn)移方程來(lái)存取每次遞歸調(diào)用的狀態(tài)值,這樣算法的效率會(huì)有所提高,就會(huì)省去很多的重復(fù)計(jì)算。

動(dòng)態(tài)規(guī)劃算法的難點(diǎn)在于 從實(shí)際問題中抽象出動(dòng)態(tài)規(guī)劃表dp,dp一般是一個(gè)數(shù)組,可能是一維的也可能是二維的,也可能是其他的數(shù)據(jù)結(jié)構(gòu):整個(gè)求解過程就可以用一個(gè)最優(yōu)決策表來(lái)描述,最優(yōu)決策表可以是一個(gè)二維表,其中行表示決策的階段,列表示問題狀態(tài),表格需要填寫的數(shù)據(jù)一般對(duì)應(yīng)此問題的在某個(gè)階段某個(gè)狀態(tài)下的最優(yōu)值(如最短路徑,最長(zhǎng)公共子序列,最大價(jià)值等),填表的過程就是根據(jù)遞推關(guān)系,從1行1列開始,以行或者列優(yōu)先的順序,依次填寫表格,最后根據(jù)整個(gè)表格的數(shù)據(jù)通過簡(jiǎn)單的取舍或者運(yùn)算求得問題的最優(yōu)解:
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}
————————————————
版權(quán)聲明:本文為CSDN博主「MISAYAONE」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/misayaaaaa/article/details/71940779

遞歸調(diào)用最簡(jiǎn)單也是最經(jīng)典的例子就是臺(tái)階問題。

有n級(jí)臺(tái)階,一個(gè)人每次上一級(jí)或者兩級(jí),問有多少種走完n級(jí)臺(tái)階的方法?

n階臺(tái)階,只可能是從n-1或是n-2的臺(tái)階上走上來(lái)的,臺(tái)階n的階段依賴的是n-1和n-2的子階段,所以狀態(tài)轉(zhuǎn)移方程為dp[n] = dp[n-1] + dp[n-2],屬于最簡(jiǎn)單的動(dòng)態(tài)規(guī)劃問題

#include <iostream>#define N 20 //臺(tái)階數(shù)為20using namespace std;int dp[N]; //全局?jǐn)?shù)組,存放決策表int fun(int n) //返回臺(tái)階數(shù)為n的走法{if (n == 1 || n == 2){return n;}dp[n-1] = fun(n-1); //若不為1或2則進(jìn)行遞歸計(jì)算dp[n-2] = fun(n-2);dp[n] = dp[n-1]+dp[n-2]; //狀態(tài)轉(zhuǎn)移方程return dp[n];}int main(int argc,char** argv){fun(N);cout<<dp[15]<<endl; //輸出15階的走法system("pause");return 0;}

鋪墊完畢,言歸正傳。

在匹配字符的過程中需要分類討論。如果p中有.字符,那么很好辦,因?yàn)樗侨f(wàn)能字符,我們直接跳過就可以,在程序中就是直接判為1.如果P中有*號(hào)可能就會(huì)麻煩些。我們需要重點(diǎn)討論下帶*和不帶*的情況。不帶*號(hào)也好辦,只要和s中的字符逐一對(duì)比就行。如果帶字符*就需要分兩種情況。見圖

?

?

?

分析完畢上代碼?

?

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);}}} ;

?

總結(jié)

以上是生活随笔為你收集整理的正则表达式匹配C++代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。