leetcode 10、Regular Expression Matching
本題大意: 給你一個(gè)字符串s, 以一個(gè)模式串p,而模式串中規(guī)則匹配的只有 '.' 和 ‘*’,其中 ‘.’ 代表匹配任意一個(gè)字符,‘*’ 代表匹配的前一個(gè)字符有0個(gè)或多個(gè),求字符串s和模式串p是否匹配?
題解:本題利用遞歸的思想使用模式串p去匹配字符串s;
1、當(dāng)p為空的時(shí)候,s為空返回true,否則返回false
2、當(dāng)p只有一個(gè)字符時(shí),s 中的字符是否為1并且 (s[0] == p[0] or p[0] == '.');
3、當(dāng)p[1] != '*'時(shí), 判斷s是否為空,是返回false, 否則返回(s[0] == p[0] or p[0] == '.') && isMatch(s.substr(1), p.substr(1))
? ? ? substr(start) 表示截取從字符串start的位置到字符串的末尾
4、當(dāng)p[1] == '*'時(shí), 判斷s是否為空 并且?(s[0] == p[0] or p[0] == '.'); 當(dāng)s和p.substr(2)匹配時(shí)直接返回true(由于*可以匹配的前一個(gè)字符可以是0個(gè),所以如果s和p.substr(2)匹配,前面的可以認(rèn)為是0個(gè),是符合模式匹配串的),如果不匹配則s = s.substr(1)
5、返回isMatch(s, p.substr(2))
?
#include <iostream> using namespace std;bool isMatch(string s, string p) {if (p.empty()) return s.empty();if (p.size() == 1){return (s.size() == 1 && (s[0] == p[0] || p[0] == '.'));}if (p[1] != '*'){if (s.empty()) return false;return (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1));}while (!s.empty() && (s[0] == p[0] || p[0] == '.')){if (isMatch(s, p.substr(2))) return true;s = s.substr(1);}return isMatch(s, p.substr(2)); }int main() {string s = "ab";string p = "a*";cout << isMatch(s, p) << endl; }?
?
?
?
?
?
?
?
?
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的leetcode 10、Regular Expression Matching的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CentOS7安装详解
- 下一篇: Jeewx-api 1.1 版本发布,微