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
[code]
public class Solution {
public boolean isMatch(String s, String p) {
if(s==null && p==null)return true;
if(s.length()==0 && p.length()==0)return true;
return matching(s,0,p,0);
}
boolean matching(String s, int i, String p, int j)
{
if(i==s.length() && j==p.length())return true;
if(i==s.length())
{
int k=0;
while(j<p.length())
{
if(k%2!=0 && p.charAt(j)!='*')return false;
k++;j++;
}
return k%2==0;
}
if(j==p.length())return false;
if(j+1>p.length()-1 || p.charAt(j+1)!='*')
{
return (p.charAt(j)=='.' || p.charAt(j)==s.charAt(i)) && matching(s, i+1, p, j+1);
}
else
{
if(matching(s,i,p,j+2))return true;
if(p.charAt(j)=='.' || p.charAt(j)==s.charAt(i))
{
int k=i;
while(k<s.length() && (s.charAt(k)==s.charAt(i)||p.charAt(j)=='.'))
{
if(matching(s,k+1,p,j+2))return true;
k++;
}
return false;
}
return false;
}
}
}
[Thoughts]
1. 一开始理解错了 .*
,.*
可以匹配任意string,不仅仅是aaa,bbbbbb, …
2. 算法实现的时候,分下一位是否是 *
来讨论。
3. 结束条件有三种情况, 注意 s已经完成,p 是a*b*c*
的形式 return true