class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
bool match(string str, string pattern) {
int n1 = str.length();
int n2 = pattern.length();
vector<vector<bool>> dp(n1+1, vector<bool>(n2+1, false));
dp[0][0]=true;
for (int i=2; i<=n2; i++){
if (pattern[i-1] == '*')
dp[0][i] = dp[0][i-2];
}
for (int i=1; i<=n1; i++){
for (int j=1; j<=n2; j++){
if (pattern[j-1]=='.'||pattern[j-1]==str[i-1]){
dp[i][j] = dp[i-1][j-1];
} else if (pattern[j-1]=='*'){
if (pattern[j-2]=='.'||pattern[j-2]==str[i-1]){
dp[i][j] = dp[i-1][j]||dp[i][j-2];
}
else dp[i][j] = dp[i][j-2];
}
}
}
return dp[n1][n2];
}
};
初始化dp数组:
- dp[0][0]=true 因为空的str和空的pattern匹配。
- 当str长度为0,pattern中有*出现,则可以忽略(字母*)这两个字符,也能匹配空的str。
分情况(设pattern当前字符位=j-1,str当前字符位为i-1):
- pattern当前字符位为'.', 或pattern当前位与str当前位匹配:取决于这一位之前两者是否完全匹配
- pattern当前字符位为'*', 分两种情况:
- pattern的‘*’前一位为‘.’,或与str当前位匹配:可以是匹配一个或多个str中的该字符,也可以是0个
- pattern的‘*’前一位与str不匹配,则pattern中的(字母*)不匹配str中的任何东西,忽略
3. pattern当前位不是特殊字符‘*’或‘.’而且与str当前位不匹配,则确定不匹配,因为数组初始值为false,故这种情况在代码中直接不用处理。



京公网安备 11010502036488号