problem:
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the<span style="color:#ff0000;"> preceding element</span>. 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
thinking:
吐槽几句:
字符串匹配,‘.‘和‘*‘的意义很简单,不用陈述,但:
isMatch("aab", "c*a*b") → true
算哪门子事?
leetcode (http://articles.leetcode.com/2011/09/regular-expression-matching.html)已有好多人在争论,这C*是不是可以代表0个C,我TM无语了。
最后的感觉就是这道题为了宣传那个特定的算法而把条件改了?
PS: 看错题目了.....2B了
(1)没有*的情况很好解决,难在怎么处理*
(2)比如ABBC与 A*C、A*BC,很清楚,利用深搜的思想,只要把BB与*、*B整体作匹配就OK了
自己写了个测试程序,官方的那个扯淡条件通不过
#include <iostream> #include <memory.h> using namespace std; class Solution { public: bool isMatch(const char *s, const char *p) { int n=0; int m=0; int index=0; while(*(s+n)!='\0') { n++; } while(*(p+m)!='\0') { m++; } // cout<<"n: "<<n<<"m: "<<m<<endl; if(n==0||m==0) return false; int *a = new int[m]; memset(a,0,sizeof(int)*m); if((*p=='.')||(*p==*s)) { a[0]=1; index++; } for(int i=1;i<m;i++) { if(a[i]==1) continue; while(index<n) { if(*(p+i)=='.') { a[i]=a[i-1]&0x01; index++; } else if(*(p+i)=='*') { int tmp_s=1; int tmp_p=1; while((*(s+index)==*(s+index+tmp_s))&&(index+tmp_s<n)) { tmp_s++; } while((*(s+index)==*(p+i+tmp_p))&&(i+tmp_p<m)) { tmp_p++; } if((index+tmp_s==n-1)&&(i+tmp_p==m-1)) { a[i+tmp_p]=a[i-1]&0x01; index+=tmp_s; break; } else { for(int j=0;j<tmp_p;j++) { a[i+j]=a[i+j-1]&0x01; index+=tmp_s; } }//else }//else if else { if(*(s+index)==*(p+i)) { index++; a[i]=a[i-1]&0x01; // cout<<"i: "<<i<<"a[i]:"<<a[i]<<endl; } else { a[i]=a[i-1]&0x00; return false; } }//else if(i==m-1) break; }//while }//for if(index<n) return false; else return a[m-1]; }//isMatch }; int main() { char *s="aab"; char *p="aa"; Solution mysolution; cout<<mysolution.isMatch(s,p)<<endl; }
我测试了几组,通过了,欢迎找BUG。
时间: 2024-10-13 21:11:07