码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 10 -- Regular Expression Matching

时间:2015-05-28 21:31:52      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:expression   matches   matching   

Regular Expression Matching

题目:
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


题意:
实现一个类似正则匹配,可以实现匹配.*.是匹配任意字符,*是匹配左边第一个字符0个或者多个。不熟悉正则的可以看看我的python正则表达式那篇文章^_^


思路:
我们肯定是按照字符一个一个匹配的,关键点不在.,如果是.,直接忽略继续跳转下一个即可,需要注意的是*。首先*是绝不会为第1个字符的(根据正则表达式规则,*是匹配最左边第一个字符,重复0次或者多次),我们只能从第二个字符开始确定号,接着我们就分成两种情况,1.有*,2.没有*,有*号时我们是不确定原串匹配字符的个数的(比如原串aaaab,和匹配串a*b,那么原串的aaaa对应的就是匹配串的a*),那么我们需要循环来判断是否匹配串*前面的字符和原串相等。此时匹配串不移动下标,原串不断的移动(因为原串是重复才能匹配 匹配串 的*的,比如上面的aaaa),直到满足条件后,我们下标跨过匹配串的*号,接着继续匹配,如果没有*号,就老老实实一个一个匹配。


代码:

int isMatch(char* s, char* p)
{
    //判断为空的情况   
    if(p[0] == ‘\0‘){
        return s[0] == ‘\0‘;
    }
    //处理‘*‘匹配,必须假设当前串的第二个字符为‘*‘,第一个不可能为‘*‘,因为‘*‘是和左边第一个作用的
    if(p[1] == ‘*‘){
        //判断原串前面的字符是否是和‘*‘前面的重复匹配,此时只移动原串,不移动匹配串
        while(s[0] != ‘\0‘ && (p[0] == ‘.‘ || s[0] == p[0])){
            if(isMatch(s, p+2))
                return 1;
            s++;    
        }
        return isMatch(s, p+2);
    }else{
        //处理非‘*‘号情况
        if(s[0] != ‘\0‘ && (p[0] == ‘.‘ || p[0] == s[0])){
            //原串和匹配串同时前进一个字符
            return isMatch(s+1, p+1);
        }
        return 0;
    }
}

#!/usr/bin/env python
#coding:UTF-8

def isMatch(s, p):
    if len(p) == 0:
        return len(s) == 0
    if len(p) == 1:
        return len(s) == 1 and p[0] == s[0]
    if p[1] == ‘*‘:
        while len(s) != 0 and (p[0] == ‘.‘ or p[0] == s[0]):
            if isMatch(s, p[2:]):
                return True
            s = s[1:]
        return isMatch(s, p[2:])
    else:
        if len(s) != 0 and (p[0] == ‘.‘ or p[0] == s[0]):
            return isMatch(s[1:], p[1:])
        return False

if __name__ == ‘__main__‘:
    print isMatch(‘aa‘, ‘a‘)
    print isMatch(‘aa‘, ‘aa‘)
    print isMatch(‘aaa‘, ‘a‘)
    print isMatch(‘aa‘, ‘.*‘)
    print isMatch(‘ab‘, ‘.*‘)
    print isMatch(‘aab‘, ‘c*a*b‘)
    print isMatch(‘aaaab‘, ‘.*ab‘)
    print isMatch(‘aaaaaaaaccc‘, ‘a*ccc‘)

技术分享

leetcode 10 -- Regular Expression Matching

标签:expression   matches   matching   

原文地址:http://blog.csdn.net/wwh578867817/article/details/46128599

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!