chenheng199898

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

面试题19 正则表达式匹配

题目:

请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

解法:

在这里插入图片描述

class Solution {
    public boolean isMatch(String A, String B) {
        int a=A.length();
        int b=B.length();
        boolean[][] f=new boolean[a+1][b+1];
        for(int i=0;i<=a;i++){
            for(int j=0;j<=b;j++){
                // 此判断可以直接得出空正则的所有情况
                if(j==0){
                    f[i][j]=i==0;
                }else{
                    // 针对非空正则进行计算
                    if(B.charAt(j-1)!='*'){
                            if(i>0&&(A.charAt(i-1)==B.charAt(j-1)||B.charAt(j-1)=='.'))
                                f[i][j]=f[i-1][j-1];
                    }else{
                     // 对于B中元素为‘*’,又可以分为两种情况:即为B中'*'前的一个元素可以与A中元素匹配与否
                     //f[i][j-2]是指直接获取B中此时的 ‘a*’忽视,赋值‘a*’之前的f值
                        if(j>=2){
                            f[i][j] |=f[i][j-2];
                        }
                      //接着回来判断一下是否需要看这个‘*’之前的一个模板元素,如果需要看就将A中的元素前移一位,
                      //有可能f[i-1][j]为false,但前一步中的f[i][j-2]将这个f[i][j]值善后。
                     //比如A=‘aaa’;B=‘aa*a’ i=2,j=3时,f[i][j]就是通过|=符号获取的f[i][j-2]的值。
                        if(i>=1&&j>=2&&(A.charAt(i-1)==B.charAt(j-2)||B.charAt(j-2)=='.'))
                       	 	f[i][j] |=f[i-1][j];
                    }
                }
            }
        }
        return f[a][b];
    }
}
class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        s, p = '#'+s, '#'+p
        m, n = len(s), len(p)
        dp = [[False]*n for _ in range(m)]
        dp[0][0] = True
        
        for i in range(m):
            for j in range(1, n):
                if i == 0:
                    dp[i][j] = j > 1 and p[j] == '*' and dp[i][j-2]
                elif p[j] in [s[i], '.']:
                    dp[i][j] = dp[i-1][j-1]
                elif p[j] == '*':
                    dp[i][j] = j > 1 and dp[i][j-2] or p[j-1] in [s[i], '.'] and dp[i-1][j]
                else:
                    dp[i][j] = False
        return dp[-1][-1]
posted on 2020-05-15 18:29  chenheng199898  阅读(59)  评论(0)    收藏  举报