·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配? 如题,·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?假如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()];
}
}