您的位置:首页 > 其它

LeetCode : Wildcard Matching

2012-12-09 04:56 399 查看
Implement wildcard pattern matching with support for
'?'
and
'*'
.

'?' Matches any single character.'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false


回头得自己写一个了

class Solution {
public:
bool isMatch(const char *s, const char *p) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
const char *str, *pat;
bool star = false;

for (str = s, pat = p; *str != '\0'; ++str, ++pat)
{
switch(*pat)
{
// 遇到'?',那么不管*str是任何字母都能匹配
case '?':
break;
case '*':
star = true;
// 暂时忽略‘*’
s = str;
p = pat;
do
{
++p;
}while(*p == '*');
// 如果'*'之后,pat是空的,直接返回true
if (!*p)
return true;
// 重新开始匹配
str = s - 1;
pat = p - 1;
break;
default:
if (*str != *pat)
{
// 如果前面没有'*',则匹配不成功
if (!star)
return false;
// 从s的下一位和'*'之后的p重新开始匹配
++s;
str = s - 1;
pat = p - 1;
}
break;
}
}

while (*pat == '*')
++pat;
return (!*pat);
}
};


下面是一个JAVA实现,递归的方法做的,挺简洁。

public class Solution {
public boolean isMatch(String s, String p) {
// Start typing your Java solution below
// DO NOT write main() function
assert(p!=null && (p.length()==0 || p.charAt(0)!='*'));

if(p.length()==0) return s.length()==0;

if(p.length()==1 || p.charAt(1)!='*'){
if(s.length()<1 || (p.charAt(0)!='.' && p.charAt(0)!=s.charAt(0)))
return false;
return isMatch(s.substring(1),p.substring(1));
}else{
int i=-1;
while(i<s.length() && (i<0 || p.charAt(0)=='.' || p.charAt(0)==s.charAt(i))){
if(isMatch(s.substring(i+1),p.substring(2)))
return true;
i++;
}
return false;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: