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

思路

实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。

1)初始化
  • dp[i][j]表示s字符串的前i个字符和p字符串的前j个字符是否匹配,初始化都是false。很显然前0个字符都是匹配的: dp[0][0]=true。
  • 如果第i-1个字符是* 并且dp[0][i-2]是true 那么dp[0][i-2] = true;
2) s的第i-1个字符和p的j-1个字符匹配或者p的j-1个字符是.则
     dp[i][j]=dp[i-1][j-1]
3) p的j-1个字符是* 分两种情况
  • p的j-1字符和s的i-1不同并且p的j-1个字符不是. 比如s=“abc” p="abcd*"那么让d* 消掉
  dp[i][j] = dp[i][j-2]
  • 否则:有三种情况举例会形象一些。。!)s=“abc” p=“abcc*” !!)s=“abc” p=“abc*” !!!) s=“abcccccccccccc” p=“ab*”
dp[i][j] = dp[i][j-2]||dp[i][j-1]||dp[i-1][j]

代码

class Solution {
    public boolean isMatch(String s, String p) {
        if(s==null||p==null) return false;
        int s_size = s.length();
        int p_size = p.length();
        boolean [][]dp  = new boolean[s_size+1][p_size+1];
        dp[0][0] = true;
        for(int i=1;i<=p_size; i++){
            if(p.charAt(i-1)=='*'&&dp[0][i-2]) dp[0][i] = true;
        }
        for(int i=1;i<=s_size;i++){
            for(int j=1;j<=p_size;j++){
                if(s.charAt(i-1)==p.charAt(j-1)||p.charAt(j-1)=='.') dp[i][j] = dp[i-1][j-1];
                else if(p.charAt(j-1)=='*'){
                    if(s.charAt(i-1)!=p.charAt(j-2)&&p.charAt(j-2)!='.') dp[i][j] = dp[i][j-2];
                    else dp[i][j]=dp[i][j-2]||dp[i][j-1]||dp[i-1][j];
                }
            }
        }
        return dp[s_size][p_size];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值