《剑指offer—面试题19:正则表达式匹配》
注明:仅个人学习笔记
package com.chapter3.code;
public class Solution
{
public boolean match(char[] str, char[] pattern)
{
// 如果字符串和模式有一个为空,则匹配失败
if (str == null || pattern == null)
{
return false;
}
int strIndex = 0;
int patternIndex = 0;
return matchCore(str, strIndex, pattern, patternIndex);
}
public boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex)
{
// 有效性检验:str到尾,pattern到尾,匹配成功
// 如果都匹配到了尾部,则说明匹配成功
if (strIndex == str.length && patternIndex == pattern.length)
{
return true;
}
// pattern先到尾,匹配失败
// 如果模式到了尾部,但字符串没匹配完,则匹配失败
if (strIndex != str.length && patternIndex == pattern.length)
{
return false;
}
// 如果模式的第二个字符是*
if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*')
{
// 当第一个字符匹配上了
if ((str[strIndex] == pattern[patternIndex] && strIndex != str.length)
|| (pattern[patternIndex] == '.' && strIndex != str.length))
{
// a.字符串后移一个,模式后移两个(即*前的字符只出现一次)
// abc a*bc
// b.字符串后移一个,模式不变(即*前的字符肯出现多次)
// aabc a*bc
// c.字符串不变,模式后移两个(即*前的字符出现0次)
// abc a*abc
return matchCore(str, strIndex + 1, pattern, patternIndex + 2)
|| matchCore(str, strIndex + 1, pattern, patternIndex)
|| matchCore(str, strIndex, pattern, patternIndex + 2);
} else// 如果第一个字符没匹配上,也就是*之前的出现0次,那模式就得从第三个字符开始(其实广义来说模式得从当前字符的后两个的位置开始)
{
return matchCore(str, strIndex, pattern, patternIndex + 2);
}
}
// 当第一个字符匹配上,但模式的第二个字符不是*时,模式和字符串都后移一位
if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])
|| (pattern[patternIndex] == '.' && strIndex != str.length))
{
// 此时字符串和模式同时后移一位,即匹配下一位
return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
} else
{
return false;// 当第一个字符串没匹配上,此时直接失败
}
}
}