这是剑指offer的一道题。
Implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
因为书本只用C++实现所以我用Java实现:
class Solution { public boolean isMatch(String st, String pa) { if(st==null||pa==null) return false; char[] str=st.toCharArray(); char[] pattern=pa.toCharArray(); return matchCore(str,0,pattern,0); } public boolean matchCore(char[] str,int s, char[] pattern,int p) { if(str.length<=s&&pattern.length<=p) return true;//都匹配完了 if(str.length>s&&pattern.length<=p) return false;//模式完了,字符串还有 //模式串a*a没结束,匹配串可结束可不结束 if(p+1<pattern.length&&pattern[p+1]=='*'){//当前pattern的下一个是*号时 //字符串完了 if(s>=str.length) return matchCore(str, s, pattern, p+2); else{ if(pattern[p]==str[s]||pattern[p]=='.'){ //当前位置匹配完成,移动到下一个模式串 return matchCore(str,s+1, pattern,p+2) ||matchCore(str,s+1, pattern,p) ||matchCore(str,s, pattern,p+2); }else return matchCore(str, s, pattern, p+2); } } //当前pattern的下一个不是*时候 if(s>=str.length) return false; else{ if(str[s]==pattern[p]||pattern[p]=='.') return matchCore(str, s+1, pattern, p+1); } return false; } }