'.' 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
public class Solution {
public boolean isMatch(String s, String p) {
// p=.* s=c ==> recursive
// p=. s=c ==> p++, s++
// p=x* s=c => p+=2
// s=x => s++
// p=x s=c => not
// s=x => p++, s++
int sl=s.length();
int pl=p.length();
char p1,p2;
char s1;
if(sl==0)
{
if(pl==0)return true; // "":"" => T
if(pl>1)
{
p1=p.charAt(0);
p2=p.charAt(1); // "":"a*" => T
if(pl==2) // "":".*" => T
{
return (p2=='*'&&(p1=='.'||(p1>='a'&&p1<='z')||(p1>='A'&&p1<='Z')));
}
else if((p1>='a'&&p1<='z')||(p1>='A'&&p1<='Z')||p1=='.')
{
if(p2=='*')
return isMatch(s,new String(p.substring(2))); // "":"a*??" => recursive
else
return false; // "":"a" => F
}
}
return false;
}
if(sl>0&&pl==0) return false; // "a...":"" => F
p1=p.charAt(0);
s1=s.charAt(0);
if(pl==1)
{
if(p1=='.'||((p1==s1)&&((p1>='a'&&p1<='z')||(p1>='A'&&p1<='Z'))))
return isMatch(new String(s.substring(1)),""); //"abc...":"?" => recursive
else
return false;
}
p2=p.charAt(1);
if((p1>='a'&&p1<='z')||(p1>='A'&&p1<='Z'))
{
if(p2=='*') // "abc...":"b*abc..." => test many cases
{
if(isMatch(s,new String(p.substring(2))))
return true;
else
for(int i=0;(i<sl)&&s.charAt(i)==p1;i++)
if(isMatch(new String(s.substring(i+1)),new String(p.substring(2))))
return true;;
return false; // "abc...":"a*cd.." =>F
}
else
{
if(p1==s1) // "a...":"a..." =>recursive
return isMatch(new String(s.substring(1)),new String(p.substring(1)));
else
return false; // "a...":"b..." =>F
}
}
else if(p1=='.')
{
if(p2=='*')
{
if(pl==2)
return true; // "????":".*" => T
else if(isMatch(s,new String(p.substring(2)))) // "a???":".*a???" => recursive
return true;
else
for(int i=0;i<sl;i++) // "aaab??":".*b" =>test many cases
if(isMatch(new String(s.substring(i+1)),new String(p.substring(2))))
return true;
return false;
}
else
{ // "ab???":".b???" => recursive
return isMatch(new String(s.substring(1)),new String(p.substring(1)));
}
}
return false;
}
}
No comments:
Post a Comment