java匹配两个字符_·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?...
·代表任意一個字符,*代表任意一串字符,判斷兩個字符串是否匹配? 如題,·代表任意一個字符,*代表任意一串字符,判斷兩個字符串是否匹配?假如a字符串為:as*bnc·b,b字符串為asdfgvbbnchb,則這倆個字符串匹配。
public class MyTest{
public static void main(String[] args) {
System.out.println(isMatch("as111111dfgvbbnchb","as*bnc.b"));
}
/**
*?動態(tài)規(guī)劃法判斷普通字符串是否與通配符字符串匹配。
*
*?
*?算法思路:
*?設s為普通字符串,p為通bai配符字符串,字符串中字符編號以0起始。
*?申請布爾型數(shù)組?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]已經(jīng)不能與空串匹配了,顯然加上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()];
}
}
總結
以上是生活随笔為你收集整理的java匹配两个字符_·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长沙检出2例奥密克戎变异株感染者 已被隔
- 下一篇: mysql slave 1032_修复m