请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
主要考虑 出现了’*’
方式1:s和p指向的都不相等,就相当于模板中 * 前面的出现了0次,此时必须让p指针向后移动2位,让模板跳过 * 即可。(对于abge和ac*mn,s指b,p指c,则让p指向m,即p+2。认为c没出现过)方式2:s和p指向的相等(这里的相等可以是真正的相等,也可以是 ‘.’ 标记的相等)。比如abcd和ab * cf,其中s和p都指向了b。此时应该s+1和p+2。比如abbcd和ab * cf,其中s和p都指向了b。由于b出现了多次,应该不着急移动p,所以此时s+1即可。比如"cba",“cb * a * a”,我也可以认为,p指向的第1个a没出现过,即使你相等。因此此时可以s不动,p+2。 public class Solution { public boolean match(char[] str, char[] pattern){ if(str == null || pattern == null) return false; return matchCore(str,pattern,0,0); } public boolean matchCore(char[] str, char[] pattern, int s, int p){ if(s == str.length && p == pattern.length) return true; if((s < str.length && p == pattern.length)) return false; if(p+1 < pattern.length && pattern[p+1] == '*'){ if((s < str.length && pattern[p] == '.') || (s < str.length && pattern[p] == str[s])){ return matchCore(str,pattern,s,p+2) ||//"cba","cb*a*a" matchCore(str,pattern,s+1,p+2) || //"abcd","ab*cf" matchCore(str,pattern,s+1,p); //"abbcd","ab*cf" }else{ return matchCore(str,pattern,s,p+2); } } if(s < str.length && (pattern[p] == str[s] || pattern[p] == '.')) return matchCore(str,pattern,s+1,p+1); return false; }}