leetcode 10 --- 正则表达式匹配
生活随笔
收集整理的這篇文章主要介紹了
leetcode 10 --- 正则表达式匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 題目
給你一個字符串?s?和一個字符規律?p,請你來實現一個支持 '.'?和?'*'?的正則表達式匹配。
'.' 匹配任意單個字符
'*' 匹配零個或多個前面的那一個元素
所謂匹配,是要涵蓋?整個?字符串?s的,而不是部分字符串。
2 思路
使用動態規劃的方法, 開辟一個大小是(s_size + 1) * (p_size + 1)的二維數組Match, Match[i][j]代表著s的前i個字符和p的前j個字符是否匹配, 要獲取Match[i][j]的值首先要觀察s的第i個字符(s[i - 1])和p的第j個字符(p[j - 1])的關系.
如果s[i - 1] =?p[j - 1]或者是p[j - 1]為'?. ', 那么s的前i個字符和p的前j個字符是否匹配取決于s的前i - 1個字符和p的前j - 1個字符是否匹配.
如果不滿足上述條件, 但是p[j - 1]為' * ', 那么就需要觀察' * '前面的字符(p[j - 2])和s的第i個字符的關系:
- 如果s[i - 1] =?p[j - 2]或者是p[j - 2]為'?. ', 也就是說, 假設匹配上的字符是a(p[j - 2] = a), 那么如果此時我們可以用任意個數的a加在p的前j-2個字符的后面看是否匹配, 那么此時我們不用一個一個枚舉我們加了多少個a, 只需要枚舉加了一個a還是不加a, 因為加了一個a的話就是看s的前i-1個字符跟p的前j-2個字符是否匹配, 它可以重復這個過程, 最終遍歷所有情況, 不加a的話就是看s的前i個字符跟p的前j-2個字符是否匹配, 以上兩種情況只要有一種滿足匹配上就能保證s的前i個字符和p的前j個字符匹配得上, 所以可以進行抑或運算.
- 如果p[j - 1]為' * ', 但是不滿足上面的s[i - 1] =?p[j - 2]或者是p[j - 2]為'?. ', 那么*前面的字符就一個都不能用了, 只能用0個, 也就是說此時就只能看s的前i個字符跟p的前j-2個字符是否匹配.
所以代碼如下:
bool isMatch(string s, string p) {int s_size = s.size();int p_size = p.size();vector<vector<int> > Match;for (int i = 0; i <= s_size; i ++) {vector<int> tmp;tmp.resize(p_size + 1);Match.push_back(tmp);}Match[0][0] = 1;for (int i = 0; i <= s_size; i ++) {for (int j = 1; j <= p_size; j ++) {if (i == 0) {//當i是0的時候,也就是說此時s一個字符也沒有,如果此時p有字符, 那么每個字符后面//必須有*,代表著這些字符都是0個的時候才能匹配上,否則就匹配不上.Match[i][j] = p[j - 1] == '*' ? Match[i][j - 2] : 0;} else {if (s[i - 1] == p[j - 1] || p[j - 1] == '.') {Match[i][j] = Match[i - 1][j - 1];} else if (p[j - 1] == '*') {if (s[i - 1] == p[j - 2] || p[j - 2] == '.') {Match[i][j] = Match[i - 1][j] | Match[i][j - 2];} else {Match[i][j] = Match[i][j - 2];}}}}}return Match[s_size][p_size]; }?
總結
以上是生活随笔為你收集整理的leetcode 10 --- 正则表达式匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python模拟登录吃鸡_Python高
- 下一篇: java代码ftp重命名未生效_java