题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
解法一:这个方法是找不到工作的
public class Solution {
public boolean match(char[] str, char[] pattern){
String s = String.valueOf(str);
String p = String.valueOf(pattern);
return s.matches(p);
}
}
解法二:递归
public class Solution {
public boolean match(char[] str, char[] pattern) {
if(str==null||pattern==null) return false;
return match(str,0,pattern,0);
}
public boolean match(char[] str,int i,char[] pattern ,int j){
if(j==pattern.length) return i==str.length;
if(j<pattern.length-1&&pattern[j+1]=='*'){
if(i<str.length&&(str[i]==pattern[j]||pattern[j]=='.')){
return match(str,i+1,pattern,j)||match(str,i,pattern,j+2);
}else{
return match(str,i,pattern,j+2);
}
}
if(i<str.length&&(str[i]==pattern[j]||pattern[j]=='.')){
return match(str,i+1,pattern,j+1);
}
return false;
}
}
解法三:动态规划
public class Solution {
public boolean match(char[] str, char[] pattern) {
if(str==null||pattern==null) return false;
boolean[][] dp = new boolean[str.length+1][pattern.length+1];
dp[str.length][pattern.length] = true;
for(int i=str.length;i>=0;i--){
for(int j=pattern.length-1;j>=0;j--){
if(j<pattern.length-1&&pattern[j+1]=='*'){
if(i<str.length&&(str[i]==pattern[j]||pattern[j]=='.')){
dp[i][j]=dp[i+1][j]||dp[i][j+2];
}else{
dp[i][j] = dp[i][j+2];
}
}else if(i<str.length&&(str[i]==pattern[j]||pattern[j]=='.')){
dp[i][j] = dp[i+1][j+1];
}
}
}
return dp[0][0];
}
}