1.本题知识点
2. 题目描述
3. 思路



package com.algorithm.str;
/**
* 请实现一个函数用来匹配包括'.'和'*'的正则表达式。 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
* 在本题中,匹配是指字符串的所有字符匹配整个模式,则返回true。
* 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
*
* @author wxq
*
*/
public class MatchPattern {
public static void main(String[] args) {
String str = "abbbaa";
String pattern = "ab*baa";
System.out.println(match(str.toCharArray(), pattern.toCharArray()));
}
/**
* 匹配
* @param str
* @param pattern
* @return
*/
static 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);
}
/**
* 可将数组索引看作指针
* @param str
* @param strIndex
* @param pattern
* @param patternIndex
* @return
*/
static boolean matchCore(char[] str, int strIndex, char[] pattern,int patternIndex) {
// str到尾,pattern到尾,匹配成功
if (strIndex == str.length && patternIndex == pattern.length) {
return true;
}
// str没到尾,pattern先到尾,匹配失败
if (strIndex != str.length && patternIndex == pattern.length) {
return false;
}
// 模式串第2个字符是*
if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*')
{
//递归条件:当前字符相同,或者模式串当前字符为 .
if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])
|| (strIndex != str.length && pattern[patternIndex] == '.' ))
{
return matchCore(str, strIndex, pattern, patternIndex + 2) // 模式串pattern后移2,str指针不变,即x*匹配了0个字符
|| matchCore(str, strIndex + 1, pattern, patternIndex);// 模式串pattern指针不变 ,str后移1位
}
//如果当前字符不相同,则跳过当前模式串的字符和* ,继续下一轮的匹配
else
{
return matchCore(str, strIndex, pattern, patternIndex + 2);
}
}
//模式串第2个字符不是 * ,这种情况其实就依次比较字符即可
if (strIndex != str.length)
{
//字符串和模式串当前字符相同,或者模式串当前字符为 . 时,同时后移1位,继续下一轮的匹配
if(pattern[patternIndex] == str[strIndex] || pattern[patternIndex] == '.'){
return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
}
}
return false;
}
}
















