LeetCode 44 Wildcard Matching

题目

我的学习计划: 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;
    }
}
原文地址:https://www.cnblogs.com/dacc123/p/11390956.html