LeetCode44-通配符匹配(Golang)

LeetCode-44:通配符匹配

题意:

        有字符串s,和模式串p,规定匹配规则如下:

  1. 模式串 p 中的 '*' ,可以与 s 中任意长度的任意字符匹配
  2. 模式串 p 中的 '?' ,可以与 s 中的一个任意字符匹配

        判断给定的 s p 能否匹配

思路:

  • 利用动态规划进行求解
    • dp[i][j] 表示 s 中前 i 个字符与 p 中前 j 个字符是否匹配
    • p[j] == '?' p[j]==s[i],则用:dp[i][j]==dp[i-1][j-1],表示可以匹配
    • p[j] == '*',因为 '*' 可以匹配多个字符,则用 dp[i][j]==dp[i-1][j] || dp[i][j-1],进行转移,用 dp[i-1][j] ,就表示占用一个 '*' 用于匹配,用 dp[i][j-1] ,就表示用了星号进行匹配,但是星号依然保留,以便用于匹配后续字符。(重要)

代码(Golang):

func isMatch(s string, p string) bool {
    var dp [][]bool=make([][]bool,len(s)+1)
    for i:=0;i<=len(s);i++{
        dp[i]=make([]bool,len(p)+1)
        dp[i][0]=false
    }
    dp[0][0]=true
    for i:=0;i<len(p);i++{
        if p[i]=='*'{
            dp[0][i+1]=true
        }else{
            break
        }
    }
    for i:=0;i<len(s);i++{
        for j:=0;j<len(p);j++{
            ii,jj:=i+1,j+1
            if s[i]==p[j] || p[j]=='?'{
                dp[ii][jj]=dp[i][j]
            }else if p[j]=='*'{
                dp[ii][jj]=dp[i][jj] || dp[ii][j]
            }else {
                dp[ii][jj]=false
            }
        }
    }
    return dp[len(s)][len(p)]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值