The first one is a LeetCode problem, and can be found here.
This one, is similar, with the only difference that now we need to take into account '+'. Here is the problem statement:
Write a Simple regex parser, where pattern can contain *, + or .
* -> 0 or none
+ -> one or more
. -> Exactly one character
Examples:
Input - Pattern = a*b+c. data= bcOutput - true
Input - Pattern - abc+ data=abcOutput - true
Input - Pattern - ab* data=c
Output - false
I will still use the recursion method as the first one. When the s.charAt(1) = '+', since there is at least one proceeding character needs to be matched, we need to check if s.charAt(0) == p.charAt(0) or p.charAt(0) == '.'. Moreover, if s is an empty string, it definitely means that they don't match, so simply return false. Now if the first character matches, we need to check how many characters are matched by '+'. I use a loop, if any character in s matches p.charAt(2) (e.g., bbbbbc, and b+c), recursively check the substring of s and p.
Update: 2015 - 03 - 18
I notice the code below has a mistake because I didn't understand regex. '+' matches the proceeding character one or more times, that means the format must be bbbbbc matches b+c, but bbbddc doesn't match b+c.
Here is the updated code.
public static boolean isMatch(String s, String p){
if(s == null)
return p == null;
if(p == null)
return false;
if(p.length() == 0)
return s.length() == 0;
if(s.equals(p))
return true;
if(p.length() == 1 || (p.charAt(1) != '*' && p.charAt(1) != '+')){
if(s.length() < 1 || (s.charAt(0) != p.charAt(0) && p.charAt(0) != '.'))
return false;
return isMatch(s.substring(1), p.substring(1));
}
if(p.charAt(1) == '+'){
//must match at least once
if(s.length() < 1 || (s.charAt(0) != p.charAt(0) && p.charAt(0) != '.'))
return false;
char match = s.charAt(0);
int index = 0;
while(index < s.length()){
if(s.charAt(index) != match)
break;
index++;
}
return isMatch(s.substring(index), p.substring(2));
}
int index_s = -1;
while(index_s < s.length() && (index_s < 0 || s.charAt(index_s) == p.charAt(0) || p.charAt(0) == '.')){
if(isMatch(s.substring(index_s + 1), p.substring(2)))
return true;
index_s++;
}
return false;
}
public static boolean isMatch(String s, String p) {
if (p == null || s == null)
return false;
if (p.length() == 0)
return s.length() == 0;
if (p.equals(s))
return true;
if (p.length() == 1 || (p.charAt(1) != '*' && p.charAt(1) != '+')) {
if (s.length() < 1 || (s.charAt(0) != p.charAt(0) && p.charAt(0) != '.'))
return false;
return isMatch(s.substring(1), p.substring(1));
}
if (p.charAt(1) == '+') {
if (s.length() < 1 || (s.charAt(0) != p.charAt(0) && p.charAt(0) != '.')) {
return false;
}
for (int i = 1; i <= s.length(); i++) {
if (i < s.length() && p.length() > 2 && s.charAt(i) != p.charAt(2))
continue;
if (isMatch(s.substring(i), p.substring(2)))
return true;
}
return false;
}
int index_s = -1;
while (index_s < s.length() && (index_s < 0 || s.charAt(index_s) == p.charAt(0) || p.charAt(0) == '.')) {
if (isMatch(s.substring(index_s + 1), p.substring(2)))
return true;
index_s++;
}
return false;
}
No comments:
Post a Comment