力扣——10. 正则表达式匹配快速解决
网上看了很多方法,但是对于大部分人来说都没那么友好,讲得也没那么通俗易懂,因此,想写一篇通俗易懂的博客,让大家快速的解决这一问题,为了更好的说明,我用text
和pattern
来分别表示目标字符串和正则表达式
题目
给你一个字符串 text
和一个字符规律 pattern
,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
首先需要对题目进行简单的分析
分析
-
对于和
.
相关的情况则比较简单,因为它可以匹配任意的字符 -
对于
*
,情况要大致分为两种:- 匹配0个前面的字符
- 匹配1个或多个前面的字符
示例:
输入:s = "aab" p = "c*a*b" 输出:true 解释:因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
-
在进行匹配之前需要先判断,
text
中是否还有未进行匹配的字符 -
在进行
*
匹配判断的时候,有一个前提条件:*
的前一个字符是匹配的 -
比较极端的情况:
text
与pattern
中任意一个为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));
}
}
}
如果觉得这篇对你有帮助,请点个赞再走吧 ^ - ^