java匹配两个字符_·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?...

·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配? 如题,·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?假如a字符串为:as*bnc·b,b字符串为asdfgvbbnchb,则这俩个字符串匹配。

public class MyTest{

public static void main(String[] args) {

System.out.println(isMatch("as111111dfgvbbnchb","as*bnc.b"));

}

/**

* 动态规划法判断普通字符串是否与通配符字符串匹配。

*

 
 

* 算法思路:

* 设s为普通字符串,p为通bai配符字符串,字符串中字符编号以0起始。

* 申请布尔型数组 dp[s.length+1][p.length+1]。

* 1. dp[0][0]表示s为空串、p为空串时是否匹配,显然为true,dp[0][0]=true。

* 2. dp[0][j+1],0=

*    当dp[0][j]=true且p[j]='*'时,dp[0][j+1]=true。

*    如果dp[0][j]=false,即p[0..j-1]已经不能与空串匹配了,显然加上p[j]

*    也不能匹配。

*    如果p[j]!='*',则p[j]必须与一个字符匹配,而s为空串,显然不能匹配。

* 3. dp[i+1][j+1]表示s[0..i]与p[0..j]是否匹配。

*  3.1 如果p[j]='*',那么可以有两种匹配方式:

*      方式1. p[j]与s[i]匹配,s[i]被匹配掉后,还需判断s[0..i-1]是否与

*      p[0..j]匹配,故dp[i+1][j+1]=dp[i][j+1]。

*      方式2. p[j]不与s[i]匹配,这时还需判断s[0..i]是否与p[0..j-1]匹配,

*      故dp[i+1][j+1]=dp[i+1][j]。

*      综合两种情况,dp[i+1][j+1]=dp[i][j+1]||dp[i+1][j]。

*  3.2 如果p[j]='.',则p[j]必须和s[i]匹配,还需判断s[0..i-1]是否与

*      p[0..j-1]匹配,故dp[i+1][j+1]=dp[i][j]。

*  3.3 如果p[j]为其他字符并且与s[i]相同,则p[j]必须和s[i]匹配,还需判断

*      s[0..i-1]是否与p[0..j-1]匹配,故dp[i+1][j+1]=dp[i][j]。

*      这种情况可以与情况3.2合并。

* 最终 dp[s.length][p.length] 即表示s与p是否匹配。

*

* @param s

*          普通字符串。

* @param p

*          通配符字符串。

* @return 如果普通字符串与通配符字符串匹配则返回true,否则返回false。

*/

public static boolean isMatch(String s,String p) {

boolean[][] dp = new boolean[s.length()+1][p.length()+1];

dp[0][0]=true;

for(int j = 0;j

if(dp[0][j] && p.charAt(j) == '*') {

dp[0][j+1] = true;

}

}

for(int i = 0;i < s.length();i++) {

for(int j = 0;j < p.length();j++) {

if(p.charAt(j) == '*') {

dp[i+1][j+1] = dp[i][j+1]|| dp[i+1][j];

}else if(p.charAt(j) == '.' || p.charAt(j) == s.charAt(i)) {

dp[i+1][j+1] = dp[i][j];

}

}

}

return dp[s.length()][p.length()];

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值