​题目​

我的学习计划: ​​LeetCode千题计划​​ 这是完成到一百题,纪念一下!

这道题目有坑,用c++会卡超时O(n*m)

但是用别的语言就不会。坑死我了。

我用动态规划,和DFS剪枝,总是给我超时,结果换种语言重新写一下就过了。

真辣鸡

C# 动态规划解法

public class Solution {

public int[,] dp = new int[3005,3005];
public bool IsMatch(string s, string p) {

if(s==""&&isEmpty(p))
return true;
if(s==""&&!isEmpty(p))
return false;
if(s!=""&&p=="")
return false;

string p2="";
for(int i=0;i<p.Length;i++)
{
if(p2.Length>0&&p2[p2.Length-1]=='*'&&p[i]=='*')
continue;

p2+=p[i];
}
p=p2;

for(int i=0;i<p.Length;i++)
{
if(p[i]=='*' && (i==0||dp[0,i-1]==1))
{
dp[0,i]=1;
}
if(i>0 && p[i-1]=='*' && dp[0,i-1]==1 &&( p[i]==s[0]||p[i]=='?'))
dp[0,1]=1;
if(i==0&&(p[i]==s[0]||p[i]=='?'))
dp[0,i]=1;

}

for(int i=0;i<s.Length;i++)
{
if(p[0]=='*')
{
dp[i,0]=1;
}
else
{
if(i==0 &&(p[0]=='?'||p[0]==s[i])) {
dp[i,0]=1;
}
}
}


for(int i=1;i<s.Length;i++)
{
for(int j=1;j<p.Length;j++)
{

if(p[j]==s[i]||p[j]=='?')
{
if(dp[i-1,j-1]==1)
{
dp[i,j]=1;
continue;
}
}
else if(p[j]=='*')
{
for(int k=i-1;k>=0;k--)
{
if(dp[k,j-1]==1){
dp[i,j]=1;
break;
}
}

if(dp[i,j-1]==1)
dp[i,j]=1;
}

}
}

if(dp[s.Length-1,p.Length-1]==1)
return true;
else
return false;
}

public bool isEmpty(string p){
for(int i = 0; i < p.Length; i++){
if(p[i] != '*') return false;
}
return true;
}
}