41. Regular Expression Matching FROM Leetcode

题目

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

频度: 3

解题之法

class Solution {
public:
    bool isMatch(string s, string p) {
        if (p.empty()) return s.empty();
        if (p.size() == 1) {
            return (s.size() == 1 && (s[0] == p[0] || p[0] == '.'));
        }
        if (p[1] != '*') {
            if (s.empty()) return false;
            return (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1)); //从下标1一直到结尾
        }
        while (!s.empty() && (s[0] == p[0] || p[0] == '.')) {
            if (isMatch(s, p.substr(2))) return true;
            s = s.substr(1);
        }
        return isMatch(s, p.substr(2));
    }
};

分析

这道求正则表达式匹配的题和那道 Wildcard Matching 通配符匹配的题很类似。
不同点在于的意义不同:Wildcard Matching中,表示可以代替任意个数的字符,而这道题中的表示之前那个字符可以有0个,1个或是多个,就是说,字符串ab,可以表示b或是aaab,即a的个数任意,这道题的难度要相对之前那一道大一些,分的情况的要复杂一些,需要用递归Recursion来解,大概思路如下:

  • 若p为空,若s也为空,返回true,反之返回false

  • 若p的长度为1,若s长度也为1,且相同或是p为'.'则返回true,反之返回false

  • 若p的第二个字符不为*,若此时s为空返回false,否则判断首字符是否匹配,且从各自的第二个字符开始调用递归函数匹配

  • 若p的第二个字符为*,若s不为空且字符匹配,调用递归函数匹配s和去掉前两个字符的p,若匹配返回true,否则s去掉首字母

  • 返回调用递归函数匹配s和去掉前两个字符的p的结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • **Question: '.' Matches any single character.'*' Matches ...
    Richardo92阅读 3,547评论 0 1
  • 在挖掘分析的过程当中对字符串的处理是极为重要的,且出现也较为频繁,R语言作为当前最为流行的开源数据分析和可视化平台...
    果果哥哥BBQ阅读 11,208评论 0 8
  • 有一种爱 芬芳了青春年华 柔软了漫长岁月 有一种爱 在心底荡起涟漪 温婉了她的心田 爱 会心动 会温暖 会幸福 爱...
    叶子青书阅读 1,414评论 0 2
  • 今天看了电影外公芳龄38。纯粹是为了消遣而看的,整部电影我不觉得有出彩的地方,而且导向也不好,特别对于那些少年容易...
    望飞雪阅读 789评论 2 1

友情链接更多精彩内容