题意:
请实现一个函数用来匹配包括'.'和'*'的正则表达式。
模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
方法:
动态规划
思路:dp[i][j]表示str的前i个字符与pattern的前j个字符是否匹配。
状态转移方程如下:
class Solution { public: int dp[35][35]={0};//dp[i][j]表示str的前i个字符与pattern的前j个字符是否匹配 bool match(string str, string pattern) { int len1=str.size(); int len2=pattern.size(); dp[0][0]=1;//初始化 //i==0是处理空str串,非空pattern串的情况 for(int i=0;i<=len1;i++){ for(int j=1;j<=len2;j++){ if(pattern[j-1]=='*'){//如果模式串字符为* if(i>0&&(str[i-1]==pattern[j-2]||pattern[j-2]=='.')) dp[i][j]|=dp[i-1][j];//至少1次 if(j>=2){ dp[i][j]|=dp[i][j-2];//0次 } }else if(pattern[j-1]=='.'){//如果模式串字符为.,则dp[i][j]=dp[i-1][j-1] if(i>0) dp[i][j]=dp[i-1][j-1]; }else{ if(i>0&&str[i-1]==pattern[j-1]){//如果模式串字符与str字符匹配,则dp[i][j]=dp[i-1][j-1] dp[i][j]=dp[i-1][j-1]; } } } } return dp[len1][len2]==1; } };
时间复杂度:空间复杂度: