Regular Expression Matching
2014-09-26 09:11
183 查看
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") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
注意:这里的a*表示a可以重复0次或者多次,不是a和*分开的。
思路:
待匹配串为S,匹配串为P。
简化问题,假设P中没有'*',那么我们只需要一位一位的比较S和P。
回到原问题,对于S[i]和P[j]:
如果P[j+1]!='*',S[i] == P[j]=>匹配下一位(i+1, j+1),S[i]!=P[j]=>return false;
如果P[j+1]=='*',如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.
'.' 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") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
注意:这里的a*表示a可以重复0次或者多次,不是a和*分开的。
思路:
待匹配串为S,匹配串为P。
简化问题,假设P中没有'*',那么我们只需要一位一位的比较S和P。
回到原问题,对于S[i]和P[j]:
如果P[j+1]!='*',S[i] == P[j]=>匹配下一位(i+1, j+1),S[i]!=P[j]=>return false;
如果P[j+1]=='*',如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.
#include <iostream> using namespace std; bool reqularMatch(string s,string p) { for(int i=0;i<s.length();i++) { for(int j=0;j<p.length();j++) { if(s[i] == p[j]) { int m =i+1,n=j+1; while(m<s.length()&&n<p.length()) { if(p != '*') { //如果下一个不是‘*’ if(p == '.' || s[m] == p ) { m++; n++; } else { return false; } } else { //如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false. //如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false. int ai = m-i+1; int aj = 0; int w = j; while(s[m]!=p[w]&&aj<=ai) { if(p[w]=='*') { w++; if(w==p.length()) return false; continue; } aj++; w++; if(w==p.length()) return false; } if(ai == aj) { return false; } m++; } } } } } return true; } void main() { string s= "ab"; string p= "c*ab*"; bool flag = reqularMatch(s,p); printf("%s",flag?"Match!\n":"Not match!\n"); }
相关文章推荐
- [LeetCode] Regular Expression Matching, Solution
- 【leetcode】第10题:Regular_Expression_Matching (Hard)
- LintCode_154 Regular Expression Matching
- 【10】Regular Expression Matching
- Leetcode 10 Regular Expression Matching
- 【LeetCode with Python】 Regular Expression Matching
- 46:Regular Expression Matching
- 【LeetCode】10. Regular Expression Matching
- LeetCode 10. Regular Expression Matching
- leetcode---regular-expression-matching---字符串
- LeetCode: Regular Expression Matching
- leetcode 10. Regular Expression Matching
- leetcode Regular Expression Matching
- [LeetCode]Regular Expression Matching、Wildcard Matching
- Regular Expression Matching
- Regular Expression Matching
- [leetcode 10] Regular Expression Matching
- 【leetcode刷题笔记】Regular Expression Matching
- Regular Expression Matching
- LeetCode-Regular Expression Matching-正则匹配-DP