zl程序教程

您现在的位置是:首页 >  前端

当前栏目

剑指 Offer 19. 正则表达式匹配

正则表达式 匹配 Offer 19
2023-09-14 08:56:53 时间

 

 

https://leetcode.cn/problems/zheng-ze-biao-da-shi-pi-pei-lcof/

 

 

 

 

func isMatch(s string, p string) bool {
    n:=len(s);m:=len(p)
    vis:=make([][]bool,0,n+1) //n+1是为了处理空串
    for i:=0;i<n+1;i++{
        vis=append(vis,make([]bool,m+1))
    }
    //fmt.Println(vis)
    for i:=0;i<=n;i++{
        for j:=0;j<=m;j++{
            if j==0&&i==0{
                vis[i][j]=true
            }else if j==0{
                vis[i][j]=false
            }else{
                //第一种情况,p[i-1]==s[j-1]||p[j-1]=.
                if p[j-1]!='*'{
                    if i>0&&(s[i-1]==p[j-1]||p[j-1]=='.'){ //注意条件判断加上()
                        vis[i][j]=vis[i-1][j-1]
                    }
                }else{
                    //第二种情况p[j-1]=*&&*是不匹配s的任何字符,即0次的情况
                    if j>=2{
                        vis[i][j]=vis[i][j]||vis[i][j-2]
                    }
                    //第三种情况p[j-1]==*&&匹配n次的情况
                    if i>=1&&j>=2&&(s[i-1]==p[j-2]||p[j-2]=='.'){//注意条件判断加上()
                        vis[i][j]=vis[i][j]||vis[i-1][j]  //这里为啥用||,是在第二种满足的情况下,也会走到这个逻辑
                    }
                }
            }
        }
    }
    return vis[n][m]
}