题目描述:
给定一个字符串s和字符规律p,实现一个支持’.‘和’*'的正则表达式
'.'匹配任意的单个字符
'*'匹配0个或多个前面的那个字符
例1:
s:aa
p:a
结果:false
a无法匹配整个aa
例2:
s:aa
p:a*
结果:true
例3:
s:aab
p:caab
true
c如果说’*'匹配0个c的话 就可以认为s可以被c*aab 匹配了
public class LeetCode10 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String string1 = sc.next();
String string2 = sc.next();
System.out.println(isMatch(string1,string2));
}
public static boolean isMatch(String s1,String s2){
int m = s1.length();
int n = s2.length();
boolean f[][] = new boolean[m+1][n+1];
f[0][0] = true;
for(int i = 0;i < m+1;i++){//这里为何要用 i = 0来开始,以 空串 和 a*为例,虽然第一个串是空的但是也是有可能是true的;
for(int j = 1;j < n+1;j++){
if(s2.charAt(j-1) != '*'){
if(matches(s1,s2,i,j)){
f[i][j] = f[i-1][j-1];
}
}
else{
if(matches(s1,s2,i,j-1)){
f[i][j] = f[i-1][j]||f[i][j-2];
}else{
f[i][j] = f[i][j-2];
}
}
}
}
return f[m][n];
}
public static boolean matches(String s1,String s2,int i,int j){
if(i == 0){
return false;
}
if(s2.charAt(j-1) == '.'){
return true;
}
return s1.charAt(i-1) == s2.charAt(j-1);
}
}