劍指offer 45 正規表示式匹配

2021-10-02 02:54:16 字數 1243 閱讀 5644

題目:請實現乙個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配

思路:

dp[i][j]  表示s的前i個是否能被p的前j個匹配

p[j] == '*',  匹配零個或者多個前面的元素s[i] != p[j-1]  && p[j-1]也不能等於『.』;不等於前面的那就不用匹配了,dp[i+1][j+1] = dp[i+1][j-1]s[i] == p[j-1], 可以匹配那就可能匹配0個,匹配1個,或者匹配多個--匹配0個 dp[i+1][j+1] = dp[i+1][j-1]  不匹配,直接跳過a*--匹配1個 dp[i+1][j+1] = dp[i+1][j]  只匹配一次,就跳過了--匹配多個 dp[i+1][j+1] = dp[i1][j+1]  匹配乙個少乙個,繼續匹配

p[j] == '.', dp[i+1][j+1] = dp[i][j]p[j] == 其他字元,s[i]!=p[j]  dp[i+1][j+1]=0   預設就是false,所以可以不用賦值鳥s[i]==p[j] 最普通的匹配,dp[i+1][j+1] = dp[i][j]

啟發或者坑

動態規劃的初始化,思路一定要清晰,dp和s、p的index相差1

在*處理的過程中,如果前一字元不相等,還應考慮前乙個字元是不是'.'

**class solution

dp.push_back(onedp);

}//dp[i][j] 表示s的前i個是否能被p的前j個匹配

//開始初始化

dp[0][0] = true;

for (int i = 1; i < slen+1; i++)

for (int j = 1; j < plen; j++)

for (int i = 0; i < slen; i++) {

for (int j = 0; j < plen; j++) {

//只有*出現了-2, 證明*前面至少有乙個字元,否則這個p是不合格的字串

//cout << "i:" << i <<" j:" << j <

劍指offer 正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 abaca 匹配,但是與 aa.a 和 aba 均不匹配 由於只涉及兩種正規表示式的匹配,...

劍指Offer 正規表示式匹配

題目 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 實現 class s...

劍指offer 正規表示式匹配

題目 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配.分析 觀察模式串中第...