第四十三题 dp的难题 维护一个二维数组 判断前面的串是否符合要求
class Solution {
public:/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
bool match(string str, string pattern) {
// write code here
// 动态规划
int strlen=str.length();
int patternlen=pattern.length();
bool dp[strlen+1][patternlen+1];
// 初始化动态规划的二维数组前两个
dp[0][0]=true;
dp[0][1]=false;
// 初始化第一行
for(int i=2;i<=patternlen;i++)
if(pattern[i-1]=='*')
dp[0][i]=dp[0][i-2];
else
dp[0][i]=false;
// 初始化第一列 都是false
for(int j=1;j<strlen;j++)
dp[j][0]=false;
// 开始动态规划
for(int i=1;i<=strlen;++i)
{
for(int j=1;j<=patternlen;++j)
{
// 如果当前字符串是匹配的(包括.) 则二维数组的值 等于左上角的值
if(str[i-1] == pattern[j-1] || pattern[j-1]=='.')
dp[i][j]=dp[i-1][j-1];
// 如果说当前的字符是*
else if (pattern[j-1] == '*')
{
// 遇到* 先假设判断*前面的字符出现0次,直接跳过判断*前字符是否相等
// 直接让结果等于*前两个的字符
// 比如说:aa[a] aab[*]a
// 此时看到*了,直接忽视b 看前面a的数组是否匹配着+
// aa[b]bba aab[*]a 直接匹配前面的aa 匹配 直接返回true
dp[i][j]=dp[i][j-2];
// 如果上面匹配,下面的判断是或 直接就是true了,也不用判断*前面的字符是什么 是否还需要匹配
// 如果上面的字符再往前不匹配了
// aab[b]ba aab[*]a 在匹配括号的阶段的时候,上面的判断只是匹配了aab和aa 是false
// 就要到下面判断 *前面的字符是否匹配
// aabb[b]a aab[*]a 就要向上一个行的位置看aabb是否匹配
// 上一行个位置代表 前面如果重复了*前面的字符,结果是否正确
// "aabba","aab*a" 看输出的结果会在倒数第二列 出现一列1
if(pattern[j-2]=='.' || pattern[j-2]==str[i-1])
dp[i][j]= dp[i][j] || dp[i-1][j];
}
else
dp[i][j]=false;
}
}
// for(int i=0;i<=strlen;i++)
// {
// for(int j=0;j<=patternlen;j++)
// cout<<dp[i][j]<<" ";
// cout<<endl;
// }
return dp[strlen][patternlen];
}
};