0
点赞
收藏
分享

微信扫一扫

LeetCode刷题笔记 字节每日打卡 正则表达式匹配

践行数据分析 2022-02-12 阅读 38

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

示例 1:

参考: 力扣


 

 f(i,j)s的前i个字符和p的前j个字符是否能够匹配,

pj为字符,如果匹配则比对前一位置,不同则匹配无效

pj为*,如果和前一个匹配则匹配s的前一个字符(匹配成功看前一个)或者p去除前一个字母(不匹配这两个字符,但是由于*可以匹配0个所以可以跳过),不匹配则直接看j-2

匹配函数:相同或者='.'

特殊值:f[0][0]=true,f[i][0]=false

注意:动态规划是需要下标+1(因为要考虑空情况),在编写代码时注意两种下标的转换

class Solution {
    public boolean isMatch(String s, String p) {
        char[] ss=s.toCharArray(),ps=p.toCharArray();
        int sl=ss.length,pl=ps.length;
        boolean[][] f=new boolean[sl+1][pl+1];
        f[0][0]=true;
        for(int i=0;i<=sl;i++){
            for(int j=1;j<=pl;j++){
                if(ps[j-1]!='*'){
                    if(match(ss,ps,i,j)){
                        f[i][j]=f[i-1][j-1];
                    }
                }
                else{
                    if(match(ss,ps,i,j-1)){
                        f[i][j]=f[i-1][j]||f[i][j-2];
                    }else{
                        f[i][j]=f[i][j-2];
                    }
                }
            }
        }
        return f[sl][pl];
    }
    private boolean match(char[] ss,char[] ps,int i,int j){
        if(i==0||j==0){
            return false;
        }
        // .可以任意匹配
        if(ps[j-1]=='.'){
            return true;
        }
        return ss[i-1]==ps[j-1];
    }
}
举报

相关推荐

0 条评论