剑指offer打卡21-正则表达式匹配(java版)
1. 考察知识点
2. 题目
- 请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
3. 思路
- 最终结果为匹配的判断:如果 str 和 pattern 判断的索引都到了头,则说明结果匹配
- 如果 str 走到了头而pattern 没有则不匹配
- 首先先判断 pattern 当前索引的下一位是否为 “*”
- 下一位为*:
如果 str 和 pattern 两个值匹配(两值相等或者 pattern为’.’) ,有三种情况:
a:* 代表0个数 , 则让 str 和 pattern的后两位的值继续比较
b: * 代表1个数, 则让str的后一位和 pattern的后两位的值继续比较
c: * 代表多个数, 则让str的后一位和 pattern的值继续比较
否则让 str 和 pattern 的后两位的值继续比较 - 下一位不为 *:
如果 str 和 pattern 两个值匹配(两值相等或者 pattern为’.’),则让 str 的后一位和 pattern 的后一位的值继续比较
匹配失败则返回false
4. 代码实现
public class Solution {
public boolean match(char[] str, char[] pattern) {
if (str == null || pattern == null)
return false;
int strIndex = 0;
int parrentIndex =0;
return matchCore(str, pattern, strIndex, parrentIndex);
}
private boolean matchCore(char[] str, char[] pattern, int strIndex, int patternIndex) {
if (strIndex == str.length && patternIndex == pattern.length)
return true;
if (strIndex != str.length && patternIndex == pattern.length)
return false;
if (patternIndex+1 < pattern.length && pattern[patternIndex+1] == '*') {
if ((strIndex < str.length && str[strIndex] == pattern[patternIndex]) || (strIndex < str.length && pattern[patternIndex] == '.'))
return matchCore(str, pattern, strIndex, patternIndex + 2) || matchCore(str, pattern, strIndex + 1, patternIndex + 2) || matchCore(str, pattern, strIndex + 1, patternIndex);
else
return matchCore(str, pattern, strIndex, patternIndex + 2);
}
if ((strIndex < str.length && str[strIndex] == pattern[patternIndex]) || (strIndex < str.length && pattern[patternIndex] == '.'))
return matchCore(str, pattern, strIndex + 1, patternIndex + 1);
return false;
}
}