题目:正则表达式匹配
题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
解题思路:
ps: 来自剑指 offer评论区
当模式中的第二个字符不是“*”时:
1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。
2、如果 字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。
而当模式中的第二个字符是“”时:
如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹配方式:
1、模式后移2字符,相当于x被忽略;
2、字符串后移1字符,模式后移2字符;
3、字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位;
这里需要注意的是:Java里,要时刻检验数组是否越界。
代码实现:
public class Solution {
public boolean match(char[] str, char[] pattern)
{
if (str == null || pattern == null) {
return false;
}
return match(str, 0, pattern, 0);
}
private boolean match(char[] str, int startS, char[] pattern, int startP) {
// 两个都走到头了
if (startS == str.length && startP == pattern.length) {
return true;
}
if (startS != str.length && startP == pattern.length) {
// pattern走到头了,但是str没有走到头
return false;
}
// 都没有走到头
// 如果pattern[startP+1]是个*
if (startP + 1 < pattern.length && pattern[startP + 1] == '*') {
// 如果此时这个单词匹配上那个模式里面的,0次,1次,或者多次
if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
return match(str, startS, pattern, startP + 2) || match(str, startS + 1, pattern, startP + 2)
|| match(str, startS + 1, pattern, startP);
} else {
// 没有匹配上,模式向后走两步
return match(str, startS, pattern, startP + 2);
}
}
// 匹配那个点
if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
// 都往后走一步
return match(str, startS + 1, pattern, startP + 1);
} else {
return false;
}
}
}