题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:
例子一开始都没看懂,仔细看了之后才发现怎么回事。。。
字符串"aaa"与模式"a.a"和"ab*ac*a"匹配:"a.a"中'.'可以代表a,所以"a.a"可以变为"aaa";"ab*ac*a"中'*'前面的字符可以出现0到多次,这个例子中*前面的b和c都出现0次,那么"ab*ac*a"也变成"aaa",所以匹配。
按照上述想法,字符串"aaa"与模式"aa.a"和"ab*a"不匹配,因为"aa.a"和"ab*a"不能变为"aaa"。
两种方法:
方法1:递归
i指向str头,j指向pattern头。
- i和j匹配,记录匹配的情况:isMatch
- j+1是*,则有以下情况:
- isMatch && match(str,i+1,pattern,j)//i和j匹配,并且i+1也和j匹配,因为j+1是*,所以j可能有多个
- match(str,i,pattern,j+2)//i和j可能匹配也可能不匹配,*前面一个j出现0次,从*后面的一个(j+2)重新匹配
- j+1不是*,isMatch && match(str,i+1,pattern,j+1)
public class Solution {
public boolean match(char[] str, char[] pattern){
return helpmatch(str, 0, pattern, 0);
}
private boolean helpmatch(char[] str,int i, char[] pattern,int j){
if(j == pattern.length) {//遍历到最后
return i == str.length;
}
boolean isMatch =(i != str.length) && (str[i] == pattern[j] || pattern[j] == '.');
if(j<pattern.length-1 && pattern[j+1]=='*') {
return (isMatch && (helpmatch(str, i+1, pattern, j)) || helpmatch(str, i, pattern, j+2));
}else {
return isMatch && helpmatch(str, i+1, pattern, j+1);
}
}
}
方法2:动态规划