题目:
实现一个函数用来匹配 '.' 和 '*' 的正则表达式。模式中的字符 '.' 表示任意一个字符,而 '*' 表示他前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。
分析一:
用递归来做。如果扫描到‘*’,就有三种情况。扫描到‘.’,就有一种情况。
代码一:
package offer.xzs.nineteenth;
public class Demo01 {
public static void main(String[] args) {
String str = "*";
String pattern = "*";
char[] chars = str.toCharArray();
char[] chars1 = pattern.toCharArray();
boolean match = match(chars, chars1);
System.out.println(match);
}
public static boolean match(char[] str, char[] pattern) {
if (str == null || pattern == null) {
return false;
}
return isMatch(str, 0, pattern, 0);
}
public static boolean isMatch(char[] str, int i, char[] pattern, int j) {
if (j == pattern.length) {
return i == str.length;
}
if (j + 1 < pattern.length && pattern[j + 1] == '*') {
if (str[i] == pattern[j] || pattern[j] == '.') {
return isMatch(str, i, pattern, j + 2) || isMatch(str, i + 1, pattern, j + 2) || isMatch(str, i + 1, pattern, j);
} else {
return isMatch(str, i, pattern, j + 2);
}
}
if (str[i] == pattern[j] || pattern[j] == '.') {
return isMatch(str, i + 1, pattern, j + 1);
}
return false;
}
}
分析二:
是用动态规划。
代码二:
package offer.xzs.nineteenth;
public class Demo02 {
public static void main(String[] args) {
String str = "aaa";
String pattern = "a.a***";
char[] chars = str.toCharArray();
char[] chars1 = pattern.toCharArray();
boolean match = match(chars, chars1);
System.out.println(match);
}
public static boolean match(char[] str, char[] pattern) {
if (str == null || pattern == null) {
return false;
}
boolean[][] dp = new boolean[str.length + 1][pattern.length + 1];
dp[0][0] = true;
for (int i = 0; i <= str.length; i++) {
for (int j = 1; j <= pattern.length; j++) {
if (j > 1 && pattern[j - 1] == '*') {
if (i > 0 && (str[i - 1] == pattern[j - 2] || pattern[j - 2] == '.')) {
//模式的'*'前一位字符与字符串的上个字符匹配
dp[i][j] = dp[i][j - 2] || dp[i - 1][j] || dp[i - 1][j - 2];
} else {
//模式的'*'前一位字符与字符串的上个字符不匹配
dp[i][j] = dp[i][j - 2];
}
} else if (i > 0 && (str[i - 1] == pattern[j - 1] || pattern[j - 1] == '.')) {
//模式的前一位字符与字符串的上个字符匹配
dp[i][j] = dp[i - 1][j - 1];
}
}
}
return dp[str.length][pattern.length];
}
}