題目:請實現乙個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(包含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 均不匹配.分析 觀察模式串中第...