字符串匹配问题 【题目】 给定字符串str,其中绝对不含有字符'.'和'*'。再给定字符串exp, 其中可以含有'.'或'*','*'字符不能是exp的首字符,并且任意两个 '*'字符不相邻。exp中的'.'代表任何一个字符,exp中的'*'表示'*' 的前一个字符可以有0个或者多个。请写一个函数,判断str是否能被 exp匹配。 【举例】 str="abc",exp="abc",返回true。 str="abc",exp="a.c",exp中单个'.'可以代表任意字符,所以返回 true。 str="abcd",exp=".*"。exp中'*'的前一个字符是'.',所以可表示任 意数量的'.'字符,当exp是"...."时与"abcd"匹配,返回true。 str="",exp="..*"。exp中'*'的前一个字符是'.',可表示任意数量 的'.'字符,但是".*"之前还有一个'.'字符,该字符不受'*'的影响, 所以str起码有一个字符才能被exp匹配。所以返回false
左大神解答:
暴力递归:
public static boolean process(char[] s, char[] e, int si, int ei) {
if (ei == e.length) {
return si == s.length;
}
if (ei + 1 == e.length || e[ei + 1] != '*') {
return si != s.length && (e[ei] == s[si] || e[ei] == '.')
&& process(s, e, si + 1, ei + 1);
}
while (si != s.length && (e[ei] == s[si] || e[ei] == '.')) {
if (process(s, e, si, ei + 2)) {
return true;
}
si++;
}
return process(s, e, si, ei + 2);
}
动态规划:
public static boolean isMatchDP(String str, String exp) {
if (str == null || exp == null) {
return false;
}
char[] s = str.toCharArray();
char[] e = exp.toCharArray();
if (!isValid(s, e)) {
return false;
}
boolean[][] dp = initDPMap(s, e);
for (int i = s.length - 1; i > -1; i--) {
for (int j = e.length - 2; j > -1; j--) {
if (e[j + 1] != '*') {
dp[i][j] = (s[i] == e[j] || e[j] == '.')
&& dp[i + 1][j + 1];
} else {
int si = i;
while (si != s.length && (s[si] == e[j] || e[j] == '.')) {
if (dp[si][j + 2]) {
dp[i][j] = true;
break;
}
si++;
}
if (dp[i][j] != true) {
dp[i][j] = dp[si][j + 2];
}
}
}
}
return dp[0][0];
}