class Solution {
public boolean isMatch(String s, String p) {
if(! p.contains("*") && p.length() != s.length()){
return false;
}
if(p.length() > 0 && p.charAt(0) != '*'){ // "*" 不在第一位
for(int i = 0; i < p.length();i++){
if(p.charAt(i) == '*'){
s = s.substring(i);
p = p.substring(i);
break;
}
if(i >= s.length() || (p.charAt(i) != s.charAt(i) && p.charAt(i) != '?')){
return false;
}
}
}
if(p.length() > 0 && p.charAt(p.length() - 1) != '*'){
for(int i = 0; i < p.length(); i++){
if(p.charAt(p.length()-1-i) == '*'){
s = s.substring(0, s.length() -i);
p = p.substring(0, p.length() -i);
break;
}
if(i >= s.length() || (p.charAt(p.length() - 1 - i) != s.charAt(s.length() - 1 - i) && p.charAt(p.length() - 1 - i) != '?')){
return false;
}
}
}
if(p.length() == 0){
return true;
}
//经过前两步后, p的类型全部被变为*str*或者str的问题, 即前后必然有*或者str中必然没有*, 此时不再需要考虑*匹配多少个字符的问题, 直接匹配*后面的字符即可
String[] patterns = p.split("\\*");
for(int i = 1; i < patterns.length; i++){
if(patterns[i].equals("")){
continue;
}
s = removeMatch(s, patterns[i]);
if(s == null){
return false;
}
}
return true;
}
//用于匹配字符串, 并且删除掉匹配到字符串之前的部分
public static String removeMatch(String s, String p){
for(int i = 0; i < s.length() - p.length() + 1; i++){
if(s.charAt(i) == p.charAt(0) || p.charAt(0) == '?'){
for(int j = 0; j < p.length(); j++){
if(s.charAt(i+j) != p.charAt(j) && p.charAt(j) != '?'){
break;
}
if(j == p.length() -1 ){
return s.substring(i+j+1);
}
}
}
}
return null;
}
}
44.通配符匹配
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- https://segmentfault.com/a/1190000003786247答案中有一个很奇怪的地方,为...
- leetcode上这个题目出现了两次,基本都是要求答题者写代码完成 '*' 和 '?' 通配符的匹配。一下摘录其中...