Regular Expression Matching
来源:互联网 发布:微城市(北京)网络 编辑:程序博客网 时间:2024/06/06 17:10
Implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.'*' Matches zero or more of the preceding element.The matching should cover the entire input string (not partial).The function prototype should be:bool isMatch(const char *s, const char *p)Some examples:isMatch("aa","a") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa", ".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → true
http://blog.csdn.net/doc_sgl/article/details/12719761
注意:这里的a*表示a可以重复0次或者多次,不是a和*分开的。
It seems that some readers are confused about why the regex pattern ".*"
matches the string"ab"
. ".*"
means repeat the preceding element 0 or more times. Here, the "preceding" element is the dot character in the pattern, which can match any characters. Therefore, the regex pattern".*"
allows the dot to be repeated any number of times, which matches any string (even an empty string). Think carefully how you would do matching of '*'
.Please note that '*'
in regular expression is different from wildcard matching, as we match the previous character 0 or more times. But, how many times? If you are stuck,recursion is your friend.
//完全不会。。。。。。//http://blog.csdn.net/doc_sgl/article/details/12719761//大概明白一些了class Solution {public: bool isMatch(string s, string p) { /** * f[i][j]: if s[0..i-1] matches p[0..j-1] * if p[j - 1] != '*' * f[i][j] = f[i - 1][j - 1] && s[i - 1] == p[j - 1] * if p[j - 1] == '*', denote p[j - 2] with x * f[i][j] is true iff any of the following is true * 1) "x*" repeats 0 time and matches empty: f[i][j - 2] * 2) "x*" repeats >= 1 times and matches "x*x": s[i - 1] == x && f[i - 1][j] * '.' matches any single character */ int m = s.size(); int n = p.size(); vector<vector<bool>> f(m + 1, vector<bool>(n + 1, false)); f[0][0] = true;//两个空串一定是匹配的 //空串与任意一个非空串都不匹配 for (int i = 1; i <= m; i++) f[i][0] = false; //要让任意的串与空串匹配,则要求当前的字符为*,切p[0,...,j-3]与空串匹配 // p[0.., j - 3, j - 2, j - 1] matches empty iff p[j - 1] is '*' and p[0..j - 3] matches empty for (int j = 1; j <= n; j++) f[0][j] = j > 1 && '*' == p[j - 1] && f[0][j - 2]; for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) //当前的字符不是*, if (p[j - 1] != '*') f[i][j] = f[i - 1][j - 1] && (s[i - 1] == p[j - 1] || '.' == p[j - 1]); else // p[0] cannot be '*' so no need to check "j > 1" here f[i][j] = (f[i][j - 2]) || ((s[i - 1] == p[j - 2] || '.' == p[j - 2]) && f[i - 1][j]); return f[m][n]; }};
- LeetCode: Regular Expression Matching
- LeetCode: Regular Expression Matching
- leetcode Regular Expression Matching
- [Leetcode] Regular Expression Matching
- Regular Expression Matching
- Regular Expression Matching
- [LeetCode]Regular Expression Matching
- Regular Expression Matching
- LeetCode-Regular Expression Matching
- Regular Expression Matching
- Regular Expression Matching LeetCode
- Regular Expression Matching
- LeetCode | Regular Expression Matching
- LeetCode: Regular Expression Matching
- Leetcode: Regular Expression Matching
- [LeetCode] Regular Expression matching
- [LeetCode] Regular Expression Matching
- LeetCode Regular Expression Matching
- 砸金花控牌教程△↑【在线演示QQ:194714506】
- 用循环链表解决约瑟夫环的范例
- 砸金花控牌方法▂◆【在线演示QQ:194714506】
- C++ 智能指针类
- 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)
- Regular Expression Matching
- iOS 学习资料整理
- 砸金花控牌手法╯▆【在线演示QQ:194714506】
- lua string库
- poj-2750 Potted Flower
- 砸金花怎么控牌∩█【在线演示QQ:194714506】
- cmake的使用实例: opencv-3.0.0-alpha安装
- 客运综合管理系统项目—附加(数据的导出)
- 砸金花怎样控牌→〒【在线演示QQ:194714506】