您的位置:首页 > 其它

LeetCode_OJ【10】Regular Expression Matching

2015-09-10 10:25 295 查看
Implement regular expression matching with support for
'.'
and
'*'
.

'.' Matches any single character.'*' Matches zero or more of the preceding element.

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", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true


这道题花了好久才弄清楚题意,a*可以表示任意个a的字符串如:“aa”,"aaa",空串也可以由它表示。

这样.*就可以表示任意位数的任意字符,所以可以表示所有字符。

很多人不理解最后一个例子为什么输出true,这里解释下:首先c*匹配空串,a*匹配“aa”,最后b完全匹配,所以匹配成功。

这个题目可以用动态规划求解,根据p串第二个字符是否为‘*’分为两种情况。

以下分别是该题C和JAVA的实现,c实现起来比较方便,java则要注意数组会不会越界。

C语言:

bool isMatch(char* s, char* p) {
    if(*p == '\0')
        return *s == '\0';
    if(*(p+1) != '*'){
        if(*p == *s || (*p == '.' && *s != '\0' ) )
            return isMatch( s+1 , p+1);
        return false;
    }
    else {
        while(*p == *s || (*p == '.' && *s != '\0' )){
            if(isMatch(s,p+2))
                return true;
            s++;
        }
        return isMatch(s,p+2);
    }
}


JAVA:

public class Solution {
public boolean isMatch(String s, String p) {
if("".equals(p))
return "".equals(s);
if(p.length() == 1 || p.charAt(1) != '*'){
if(!"".equals(s) && ( p.charAt(0) == s.charAt(0) || p.charAt(0) == '.' ) ){
return isMatch(s.substring(1),p.substring(1));
}
return false;
}
else{
while(!"".equals(s) && ( p.charAt(0) == s.charAt(0) || p.charAt(0) == '.' ) ){
if(isMatch(s, p.substring(2)))
return true;
s = s.substring(1);
}
return isMatch(s,p.substring(2));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息