题目:给定一个字符串 (s) 和一个字符模式 ( p )。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符。‘ * ’匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
(s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。)
我的答案:
利用java现有正则方法可直接求出
import java.util.regex.*;
class Solution {
public static Pattern pattern;
public static Matcher matcher;
public boolean isMatch(String s, String p) {
pattern = Pattern.compile(p);
matcher = pattern.matcher(s);
boolean Match = matcher.matches();
return Match;
}
}
答案:
每次从字符串里拿出一个字符与pattern中的字符去匹配。如果模式中的字符与字符串中的字符相等或模式中的字符为’.’,则它们相互匹配。
当模式中的第二个字符是’*‘时,问题要复杂一些。
(1)因为’ * '可以匹配字符串中的0个字符,所以可以直接在pattern上向后移动两个字符,相当于直接忽略模式串中这一部分
(2)pattern中的第一个字符和字符串中的第一个字符相匹配,则在字符串上向后移动一个字符。
eg: str = “abc”,pattern = “a * bc” ,第一个字符匹配时,可以直接检验"bc"与pattern是否匹配(因为根据第一种情况,会忽略pattern中的前两个字符)
class Solution {
public boolean isMatch(String text, String pattern) {
if (pattern.isEmpty()) return text.isEmpty();
//第一个字符是否匹配
boolean first_match = (!text.isEmpty() &&
(pattern.charAt(0) == text.charAt(0) || pattern.charAt(0) == '.'));
//第二个字符为‘*’时,直接忽略前两个字符 或者 当第一个字符匹配时字符串向后移动一个字符
if (pattern.length() >= 2 && pattern.charAt(1) == '*'){
return (isMatch(text, pattern.substring(2)) ||
(first_match && isMatch(text.substring(1), pattern)));
} else {
//否则判断第一个字符以及剩下的字符是否匹配
return first_match && isMatch(text.substring(1), pattern.substring(1));
}
}
}