java实现匹配字符串(附完整源码)
public class StringMatcher {
// 判断 text 字符串是否包含 pattern 字符串
public static boolean isMatch(String text, String pattern) {
int n = text.length();
int m = pattern.length();
// 如果 pattern 为空,则 text 必须也为空才匹配
if (m == 0) {
return (n == 0);
}
// 初始化 dp 数组
boolean[][] dp = new boolean[n + 1][m + 1];
dp[0][0] = true;
// 处理 pattern 的第一行
for (int j = 1; j <= m; j++) {
if (pattern.charAt(j - 1) == '*') {
dp[0][j] = dp[0][j - 2];
}
}
// 处理剩余的行和列
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char c = text.charAt(i - 1);
char p = pattern.charAt(j - 1);
// 如果当前字符匹配,则 dp[i][j] 取决于 dp[i-1][j-1]
if (c == p || p == '.') {
dp[i][j] = dp[i - 1][j - 1];
}
// 如果当前字符是 '*',则有两种情况:
// 1. '*' 匹配了 0 个前一个字符,此时 dp[i][j] 取决于 dp[i][j-2]
// 2. '*' 匹配了 1 个或多个前一个字符,此时 dp[i][j] 取决于 dp[i-1][j]
else if (p == '*') {
if (dp[i][j - 2]) {
dp[i][j] = true;
} else if (c == pattern.charAt(j - 2) || pattern.charAt(j - 2) == '.') {
dp[i][j] = dp[i - 1][j];
}
}
// 如果当前字符不匹配,则 dp[i][j] 为 false
else {
dp[i][j] = false;
}
}
}
return dp[n][m];
}
public static void main(String[] args) {
String text = "hello world";
String pattern = "ll";
boolean isMatched = isMatch(text, pattern);
if (isMatched) {
System.out.println("Text contains pattern.");
} else {
System.out.println("Text does not contain pattern.");
}
}
}