正则表达式匹配
请实现一个函数来匹配包含"."
和"*"
的正则表达式。模式中的字符"."
表示任意一个字符,而"*"
表示它前面的字符可以出现任意次(含0次)
示例
输入:aaaa
和a*b*ac*a
输出:true
输入:aaaa
和a*b.ac*a
输出:false
分析:
- 模式串第二个字符是
*
- 首字母匹配或者模式串为
.
-
*
匹配0
次:字符串不变,模式串后移两个字符 -
*
匹配1
次:字符串后移一个字符,模式串后移两个字符 -
*
匹配多次:字符串后移一个字符,模式串不变
-
- 首字母不匹配,字符串不变,模式串后移两个字符
- 模式串第二个字符不是
*
- 首字母匹配或者模式串为
.
,字符串和模式串均后移一个字符 - 首字母不匹配,返回
false
public class RegularExpressionsMatching {
public boolean match(String input, String pattern) {
if (input == null || pattern == null) {
return false;
}
return matchCore(input, 0, pattern, 0);
}
private boolean matchCore(String input, int id, String pattern, int pd) {
if (id == input.length() && pd == pattern.length()) return true;
if (id != input.length() && pd == pattern.length()) return false;
// 模式串第二个字符是*
if (pd + 1 < pattern.length() && pattern.charAt(pd + 1) == '*') {
if (input.charAt(id) == pattern.charAt(pd)
|| (id != input.length() && pattern.charAt(pd) == '.')) {
// 首字母匹配或者模式串为.
// *匹配0次:字符串不变,模式串后移两个字符
// *匹配1次:字符串后移一个字符,模式串后移两个字符
// *匹配多次:字符串后移一个字符,模式串不变
return matchCore(input, id, pattern, pd + 2)
|| matchCore(input, id + 1, pattern, pd + 2)
|| matchCore(input, id + 1, pattern, pd);
} else {
// 首字母不匹配,字符串不变,模式串后移两个字符
return matchCore(input, id, pattern, pd + 2);
}
}
// 模式串第二个字符不是*
if (input.charAt(id) == pattern.charAt(pd)
|| (id != input.length() && pattern.charAt(pd) == '.')) {
// 首字母匹配或者模式串为.
return matchCore(input, id + 1, pattern, pd + 1);
}
return false;
}
}
网友评论