字符串通配(动态规划java)

来源:互联网 发布:javascript对象是什么 编辑:程序博客网 时间:2024/05/18 03:55

1、牛客网题目:

题目描述

对于字符串A,其中绝对不含有字符’.’和’*’。再给定字符串B,其中可以含有’.’或’*’,’*’字符不能是B的首字符,并且任意两个’*’字符不相邻。exp中的’.’代表任何一个字符,B中的’*’表示’*’的前一个字符可以有0个或者多个。请写一个函数,判断A是否能被B匹配。

给定两个字符串AB,同时给定两个串的长度lenalenb,请返回一个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));    }}