1、牛客网题目:
题目描述
对于字符串A,其中绝对不含有字符’.’和’*’。再给定字符串B,其中可以含有’.’或’*’,’*’字符不能是B的首字符,并且任意两个’*’字符不相邻。exp中的’.’代表任何一个字符,B中的’*’表示’*’的前一个字符可以有0个或者多个。请写一个函数,判断A是否能被B匹配。
给定两个字符串A和B,同时给定两个串的长度lena和lenb,请返回一个bool值代表能否匹配。保证两串的长度均小于等于300。
测试样例:
"abcd",4,".*",2
返回:true
2、思想分析:
2.1、默认已经建立动态数组dynamic[lena+1][lenb+1];且 dynamic[0[0]=true;
2.2、dynamic[i][j]表示:将字符串B.subString(0,j)转为A.subString(0,i)是否可能。
2.3、dynamic[i][j]的取值根据B的当前比较字符,即B.charAt(j-1),有3种判定情况:
2.3.1、当B.charAt(j-1)==’*’时,B可以通过添加一个字符和A相同,此时dynamic[i][j]值和dynamic[i-1][j]相同;
B也可以通过不添加字符A相同,此时dynamic[i][j]值和dynamic[i][j-1]相同;
2.3.2、当B.charAt(j-1)==’.’时,此时dynamic[i][j]值和dynamic[i-1][j-1]相同;
2.3.3、当B.charAt(j-1)为字符时,dynamic[i][j]=dynamic[i-1][j-1] && B.chartAt(j-1)==A.chartAt(i-1)
3、code:已a
package schooloffer;
/**
* Created by caoxiaohong on 17/10/27.
* 对于字符串A,其中绝对不含有字符’.’和’*’。再给定字符串B,其中可以含有’.’或’*’,....
* 动态规划
*/
public class WildMatch {
public boolean chkWildMatch(String A, int lena, String B, int lenb) {
// write code here
boolean[][] dynamic = new boolean[lena + 1][lenb + 1];
dynamic[0][0] = true;
for (int i = 1; i < lena + 1; i++) {
for (int j = 1; j < lenb + 1; j++) {
if (B.charAt(j - 1) == '*') {
dynamic[i][j] = dynamic[i - 1][j] || dynamic[i][j-1];//添加1个字符 || 添加0个字符
} else if (B.charAt(j - 1) == '.') {
dynamic[i][j] = dynamic[i - 1][j - 1];
} else {
dynamic[i][j] = A.charAt(i - 1) == B.charAt(j - 1) && dynamic[i - 1][j - 1];
}
}
}
return dynamic[lena][lenb];
}
public static void main(String[] args) {
WildMatch t=new WildMatch();
System.out.println(t.chkWildMatch("abcd",4,".*",2));
}
}