10. 正则表达式匹配快速解决——最通俗易懂

力扣——10. 正则表达式匹配快速解决

网上看了很多方法,但是对于大部分人来说都没那么友好,讲得也没那么通俗易懂,因此,想写一篇通俗易懂的博客,让大家快速的解决这一问题,为了更好的说明,我用textpattern来分别表示目标字符串和正则表达式

题目

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

'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

首先需要对题目进行简单的分析

分析

  1. 对于和.相关的情况则比较简单,因为它可以匹配任意的字符

  2. 对于*,情况要大致分为两种:

    • 匹配0个前面的字符
    • 匹配1个或多个前面的字符

    示例:

    输入:s = "aab" p = "c*a*b"
    输出:true
    解释:因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
    
  3. 在进行匹配之前需要先判断,text中是否还有未进行匹配的字符

  4. 在进行*匹配判断的时候,有一个前提条件:*的前一个字符是匹配的

  5. 比较极端的情况:textpattern中任意一个为null或者都为null,这些情况中只有都为null时才返回true

流程图

为了方便大家能够理解:在展示代码之前,我先给大家看一下流程图,这里用到的方法是递归,并且,为了能够让大家更容易能看出来,我用不同颜色对字符串中的各个字符使用了不一样的颜色

在这里插入图片描述

代码(java)

public class Solution {
    
    
    public boolean isMatch(String text,String pattern) {
    
    
        /**
         * 都为空是返回true
         */
        if (pattern.isEmpty()) {
    
    
            return text.isEmpty();
        }

        /**
         * 通过第一个字符判断是否匹配
         * 1、都是字符且相同
         * 2、pattern中第一个字符为 .
         */
        boolean fMatch = (!text.isEmpty()
                && (pattern.charAt(0) == text.charAt(0) || pattern.charAt(0) == '.'));

        /**
         * 进行匹配时遇到 *则分两种情况:
         *      1、*表示匹配0个前面的字符
         *      2、*表示匹配1个或多个前面的字符
         *
         * 若没有*则逐个进行匹配
         */
        if (pattern.length() >= 2 && pattern.charAt(1) == '*') {
    
    
            return (isMatch(text,pattern.substring(2)))
            || (fMatch && isMatch(text.substring(1),pattern));
        }else {
    
    
            return fMatch && isMatch(text.substring(1),pattern.substring(1));
        }
    }
}

如果觉得这篇对你有帮助,请点个赞再走吧 ^ - ^

猜你喜欢

转载自blog.csdn.net/weixin_44829930/article/details/109539476
今日推荐