标签:
又是一道字符串题,一下子难有思路,所以往动态规划方向思考。
找到动归思路不难,主要是要考虑各种情况。首先将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 };
标签:
原文地址:http://www.cnblogs.com/vaecn/p/5324620.html