正则表达式匹配

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

找到动归思路不难,主要是要考虑各种情况。首先将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

 

转载于:https://www.cnblogs.com/vaecn/p/5324620.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值