题目:
Implement wildcard pattern matching with support for
'?'
and'*'
.'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). 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", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → false
这个题目真是晕了,之前有一题正则表达式 ,那题搞定了以为这个也简单,结果用递归的方法直接超时了。后来看到leetcode讨论区里面用动态规划去解的方法,看了一下还是有点繁琐,空间复杂度也较大。后来又找到另外的方法,这个叫uniagle的同学把‘*’作为分隔符先拆分再逐个匹配的。感觉还是有点繁琐,应该有更好的办法,于是找到了另一个实现,这个方法很喜欢,因此自己按这个方法搞一波,妥妥地过了。
1 bool isMatch(const char *s, const char *p) { 2 /*recusive version 3 if(*p=='?') { 4 if(*s==' ') 5 return false; 6 else 7 return isMatch(s+1,p+1); 8 } 9 if(*p=='*'&&*(p+1)==' ') return true; 10 11 if(*p=='*'){ 12 while(*p=='*') p++; 13 for(int i=0;*(s+i)!=' ';i++){ 14 if(isMatch(s+i,p)) 15 return true; 16 } 17 return false; 18 } 19 if(*s==*p) return isMatch(s+1,p+1); 20 else return false; 21 */ 22 // loop 23 const char *str,*ptr; 24 bool hasStar=false; 25 for(str=s,ptr=p;*str;str++){ 26 if(*ptr=='?'){ 27 if(*s=='