题目描述
对于字符串A,其中绝对不含有字符’.’和’*’。再给定字符串B,其中可以含有’.’或’*’,’*’字符不能是B的首字符,并且任意两个’*’字符不相邻。exp中的’.’代表任何一个字符,B中的’*’表示’*’的前一个字符可以有0个或者多个。请写一个函数,判断A是否能被B匹配。
给定两个字符串A和B,同时给定两个串的长度lena和lenb,请返回一个bool值代表能否匹配。保证两串的长度均小于等于300。
测试样例:
"abcd",4,".*",2
返回:true
我的代码:就是测试出来的,算是暴力解法,不对就改的那种:
import java.util.*;
public class WildMatch {
public boolean chkWildMatch(String A, int lena, String B, int lenb) {
// write code here
if (B == null || A == null)
return false;
if (B.contains(A))
return true;
String[] split = null;
if (B.contains("*")) {
split = B.split("\\*");
for (String sub : split) {
if (sub.contains(".")) {
int j = sub.indexOf('.');
int k = -1;// A的与sub匹配的首字母
for (int i = 0; i < sub.length(); i++) {
if (sub.charAt(i) != '.') {
int m = A.indexOf(sub.charAt(i));
if (k == -1) {
k = m;
}
if (sub.charAt(i) == A.charAt(k)) {
k++;
} else {
return false;
}
} else {
k++;
}
}
// 匹配
A = A.substring(sub.length());
} else {
if (A.contains(sub)) {
int i = A.indexOf(sub);
A = A.substring(i + sub.length());
} else {
return false;
}
}
}
}else {
String sub=B;
if (sub.contains(".")) {
int j = sub.indexOf('.');
int k = -1;// A的与sub匹配的首字母
for (int i = 0; i < sub.length(); i++) {
if (sub.charAt(i) != '.') {
int m = A.indexOf(sub.charAt(i));
if(m==-1)return false;
if (k == -1) {
k = m;
}
if (sub.charAt(i) == A.charAt(k)) {
k++;
} else {
return false;
}
} else {
k++;
}
}
// 匹配
A = A.substring(sub.length());
} else {
if (A.contains(sub)) {
int i = A.indexOf(sub);
A = A.substring(i + sub.length());
} else {
return false;
}
}
}
return true;
}
}
s别人的代码:很简洁:
链接:https://www.nowcoder.com/questionTerminal/28acd1134e344040ad105b3786a79e7a
来源:牛客网
public static boolean chkWildMatch(String A, int lena, String B, int lenb) {
// d[i][j]表示A中的1~i位可以匹配B中的1~j位
boolean[][] d = new boolean[lena + 1][lenb + 1];
// 初始化
d[0][0] = true;
for (int i = 1; i <= lena; i++) {
for (int j = 1; j <= lenb; j++) {
if (B.charAt(j - 1) == '*') {
d[i][j] = d[i - 1][j] || d[i][j - 1];
} else if (B.charAt(j - 1) == '.') {
d[i][j] = d[i - 1][j - 1];
} else {
d[i][j] = d[i - 1][j - 1] && A.charAt(i - 1) == B.charAt(j - 1);
}
}
}
return d[lena][lenb];
}