题干
给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。
‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。
说明:
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
想法
注释写的很详细了,难点在* *可以匹配空 可以匹配任意
Java代码
class Solution {
public boolean isMatch(String s
, String p
) {
int sp
= 0;
int pp
= 0;
int star
= -1;
int match
= 0;
while(sp
< s
.length()){
if(pp
< p
.length() &&(s
.charAt(sp
) == p
.charAt(pp
) || p
.charAt(pp
) == '?')){
sp
++;
pp
++;
}
else if(pp
< p
.length() && p
.charAt(pp
) == '*'){
star
= pp
;
match
= sp
;
pp
++;
}else if(star
!= -1){
match
++;
sp
= match
;
pp
= star
+ 1;
}else return false;
}
while(pp
< p
.length() && p
.charAt(pp
) == '*'){
pp
++;
}
return p
.length() == pp
;
}
}
我的leetcode代码已经上传到我的githttps://github.com/ragezor/leetcode