• 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;
        }
    }
    
  • 相关阅读:
    5. Fragment详解
    4. 2D绘制与控件绘制
    3、用继承和组合方式定制控件
    2、复杂布局实现
    1、android源代码下载与跟踪
    19、照相机技术
    18、GPS技术
    17、Wi-Fi Direct
    16、蓝牙技术
    15、NFC技术:使用Android Beam技术传输文件
  • 原文地址:https://www.cnblogs.com/dacc123/p/11390956.html
Copyright © 2020-2023  润新知