题目
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
示例 1:
输入: s = “aa” p = “a” 输出: false 解释: “a” 无法匹配 “aa” 整个字符串。
示例 2:
输入: s = “aa” p = “a*” 输出: true 解释: 因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素,
在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。示例 3:
输入: s = “ab” p = “." 输出: true 解释: ".” 表示可匹配零个或多个(’*’)任意字符(’.’)。
示例 4:
输入: s = “aab” p = “cab” 输出: true 解释: 因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个,
‘a’ 被重复一次。因此可以匹配字符串 “aab”。示例 5:
输入: s = “mississippi” p = “misisp*.” 输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regular-expression-matching
解答
本题中,只要不是 ‘*’ 都可以一一对应着比较,否则需要进行错位对比,错位对比有两种情况:
- *为多个前面那个元素:此时要将字符串后一个的元素与匹配字符串的当前元素进行对比。
isMatch(s.substring(1), p);
- *为零个前面那个元素:此时要将匹配字符串后面第二个字符与字符串当前字符进行对比。
isMatch(s, p.substring(2));
其次,这是一个递归函数,退出递归的条件要注意,不然容易陷入死循环。本题退出循环的条件有两种:
- 字符串当前字符与匹配字符串当前字符不相等。
- 匹配字符串为空时,字符串是否为空。
完整的代码如下:
class Solution {
public boolean isMatch(String s, String p) {
boolean marth = false;
if (p.isEmpty()) {
if (s.isEmpty()) {
return true;
}else {
return false;
}
}
marth = !s.isEmpty() && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.');
//*号匹配
if (p.length() >= 2 && p.charAt(1) == '*') {
//第一种情况 *为多个前面那个元素
boolean a = marth && isMatch(s.substring(1), p);
//第二种情况 *为零个前面那个元素
boolean b = isMatch(s, p.substring(2));
return a || b;
}else {
return marth && isMatch(s.substring(1), p.substring(1));
}
}
}