码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式匹配

时间:2016-03-27 01:38:58      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

又是一道字符串题,一下子难有思路,所以往动态规划方向思考。

找到动归思路不难,主要是要考虑各种情况。首先将pattern进行处理,记下不含"*"的字符串npattern,同时用一个vector记录新字符串里有哪几个字符是可以任意个数的(这里我本来以为像b*b*这样的要简化为b,后来发现简化为bb就可以,因为vector记下了这两个b都是可以任意个数的,因此在动归时无影响)。然后进行动归时需要注意初始化问题(prev[0]=1),同时需要注意如果开头有若干个字符可以有任意个数,但对它们进行动归后发现没有值得匹配的字符(数组rear中每个元素都是0),那么我们就不需要将prev和rear互换(因为可以将这些字符取0个),否则会出错。

技术分享
 1 class Solution {
 2 public:
 3     bool match(char* str, char* pattern)
 4     {
 5         vector<int> record;
 6         int col=strlen(str)+1;
 7         int* prev=new int[col];
 8         int* rear=new int[col];
 9         int len=strlen(pattern);
10         char* npattern=new char[len+1];
11         int row=0;
12         for(int i=0;i<len;i++)
13         {
14             if(pattern[i]==*)
15                 record.push_back(row-1);
16             else
17                 npattern[row++]=pattern[i];
18         }
19         npattern[row++]=\0;
20         if(strlen(str)==0&&row-1==record.size())
21             return true;
22         memset(prev,0,col*4);
23         prev[0]=1;
24         int i=1,j=1;
25         int num=0;
26         int flag=0;
27         for(i=1;i<row;i++)
28         {
29             rear[0]=0;
30             for(j=1;j<col;j++)
31             {
32                 if(num<record.size()&&i-1==record[num])
33                 {
34                     if(npattern[i-1]==str[j-1]||npattern[i-1]==.)
35                     {
36                         rear[j]=max(rear[j-1],max(prev[j],prev[j-1]));
37                         flag=1;
38                     }    
39                     else if(npattern[i-1]!=str[j-1])
40                     {
41                         rear[j]=prev[j];
42                     }
43                 }
44                 else
45                 {
46                     if(npattern[i-1]==.)
47                     {
48                         rear[j]=prev[j-1];
49                     }
50                     else
51                     {
52                         if(npattern[i-1]==str[j-1])
53                             rear[j]=prev[j-1];
54                         else
55                             rear[j]=0;
56                     }
57                 }
58             }
59             if(num<record.size()&&i-1==record[num])
60             {
61                 num++;
62                 if(flag==0)
63                     continue;
64                 flag=0;
65             }
66             swap(rear,prev);
67         }
68         return (prev[col-1]==1?true:false);
69     }
70 };
View Code

 

正则表达式匹配

标签:

原文地址:http://www.cnblogs.com/vaecn/p/5324620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!