題目描述(建議背下來)
給定一個字符串(s)和一個字符模式 (p),實現一個支持 ‘?’ 和 ‘*’ 的通配符匹配。
‘?’ 可以匹配任何單個字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
兩個字符串完全匹配纔算匹配成功。
說明:
- s 可能爲空,且只包含從 a-z 的小寫字母。
- p 可能爲空,且只包含從 a-z 的小寫字母,以及字符 ? 和 *。
示例 1:
輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字符串。
示例 2:
輸入:
s = "aa"
p = "*"
輸出: true
解釋: '*' 可以匹配任意字符串。
示例 3:
輸入:
s = "cb"
p = "?a"
輸出: false
解釋: '?' 可以匹配 'c', 但第二個 'a' 無法匹配 'b'。
示例 4:
s = "adceb"
p = "*a*b"
輸出: true
解釋: 第一個 '*' 可以匹配空字符串, 第二個 '*' 可以匹配字符串 "dce".
示例 5:
輸入:
s = "acdcb"
p = "a*c?b"
輸出: false
代碼實現(建議背下來)
public static boolean isMatch(String s,String p) {
int sp=0;//定義s的位置爲0
int pp=0;//定義p的位置爲0
int match=0;
int star=-1;//star表示*出現的位置
while (sp<s.length()) {
if (pp<p.length()&&(s.charAt(sp)==p.charAt(pp)||p.charAt(pp)=='?')) {
//當s和p的當前位置可以匹配或者p的當前位置是?時,向後移動一步
sp++;
pp++;
}else if (pp<p.length()&&p.charAt(pp)=='*') {
star=pp;//記錄當前*的位置
match=sp;//記錄當前s字符串的匹配位置
pp++;
}else if (star!=-1) {
pp=star+1;
match++;
sp=match;
}else {
return false;
}
}
//上面的while循環之後sp一定走到了頭,但是pp不一定走到了頭
while (pp<p.length()&&p.charAt(pp)=='*') {
pp++;
}
return pp==p.length();
}