Regular Expression Matching

来源:互联网 发布:用棒针编织围巾的编程 编辑:程序博客网 时间:2024/06/05 22:25

正则表达式的匹配

'.' 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
题目中已经说明,函数原型是
isMatch(const char *s, const char *p)
而我们代码实现部分,题目给出的函数如下:  bool isMatch(string s, string p) 
函数原型的代码解法网上很多答案,这给出下面string类型的解法。
 bool isMatch(string s, string p)     {        int m = s.length();        int n = p.length();        return backtracking(s,m,p,n);      }    bool backtracking(string& s, int i, string& p, int j)  {          if (i == 0 && j == 0)              return true;          if (i != 0 && j == 0)              return false;          if (i == 0 && j != 0)          {              //in this case only p == "c*c*c*" this pattern can match null string              if (p[j-1] == '*')              {                  return backtracking(s, i, p, j-2);              }              return false;          }          //now both i and j are not null          if(p[j-1] == '*')          {               /*             分两种情况,p[j-2] 等于s[j-1]和不等于的情况             若不等于 直接返回 backtracking(s,i,p,j-2);             若等于,由于*可能匹配一个或多个,             所以可能返回 backtracking(s,i-1,p,j-2);             也可能返回 backtracking(s,i-1,p,j);              还可能返回 backtracking(s,i,p,j-2);            */              if(p[j-2] == s[i-1] || p[j-2] == '.')                  return backtracking(s,i-1,p,j) || backtracking(s,i-1,p,j-2) ||  backtracking(s,i,p,j-2);              else                  return backtracking(s,i,p,j-2);          }          if (s[i-1] == p[j-1] || p[j-1] == '.')          {              return backtracking(s, i - 1, p, j - 1);          }          return false;    }  




0 0
原创粉丝点击