leetcode.10. Regular Expression Matching
2016-05-16 22:26
375 查看
Implement regular expression matching with support for
'.' 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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa",
".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → true
首先,想到采用的方法是递归和不然会写奔溃的==
第一步是明确“.”和“*”的含义
".":匹配任意除换行符‘\n’外的字符;例如a.c可以匹配abc,也可以acc,etc;
"*":匹配前一个字符0词或无限次;这句话需要好好理解一下,这句话可以确定两点,第一“*”前面必定有一个字符,第二是可以匹配0次或无限次,比如“abc“*”,我想大多数人会误解为这个串可以匹配的最短字符是“abc”,事实上并不是这样的,最短能匹配的串是"ab",也就是说我们可以把“c*”看成是一个整体,这是一个误区。
明白这两个规则之后,就是分析字符串可能出现的情况,分为三种情况:
(1)p为空串,如果s也是空串,则匹配成功,返回true,否则返回false;
(2)p的下一个字符是*,这时候就需要判断p的当前字符和s的当前字符是否相等或者说当前字符是'.'并且s为非空,如果成立,需要判断跳过这个‘*’之后是否能匹配,匹配成功则返回true,否则s++;反之条件不成立则直接跳过'*';
(3)p的下一个字符不是'*',直接判断p和s的当前字符是否相等或者说p是‘.’,则直接跳到下一个字符,否则返回false;
思路还是比较清晰的,就是可能当时想的时候容易混乱,有一个比较好的方法是先不管'.',先把'*'写出来,然后再去考虑加上'.'之后,加上判断就好了。
'.'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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa",
".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → true
首先,想到采用的方法是递归和不然会写奔溃的==
第一步是明确“.”和“*”的含义
".":匹配任意除换行符‘\n’外的字符;例如a.c可以匹配abc,也可以acc,etc;
"*":匹配前一个字符0词或无限次;这句话需要好好理解一下,这句话可以确定两点,第一“*”前面必定有一个字符,第二是可以匹配0次或无限次,比如“abc“*”,我想大多数人会误解为这个串可以匹配的最短字符是“abc”,事实上并不是这样的,最短能匹配的串是"ab",也就是说我们可以把“c*”看成是一个整体,这是一个误区。
明白这两个规则之后,就是分析字符串可能出现的情况,分为三种情况:
(1)p为空串,如果s也是空串,则匹配成功,返回true,否则返回false;
(2)p的下一个字符是*,这时候就需要判断p的当前字符和s的当前字符是否相等或者说当前字符是'.'并且s为非空,如果成立,需要判断跳过这个‘*’之后是否能匹配,匹配成功则返回true,否则s++;反之条件不成立则直接跳过'*';
(3)p的下一个字符不是'*',直接判断p和s的当前字符是否相等或者说p是‘.’,则直接跳到下一个字符,否则返回false;
思路还是比较清晰的,就是可能当时想的时候容易混乱,有一个比较好的方法是先不管'.',先把'*'写出来,然后再去考虑加上'.'之后,加上判断就好了。
class Solution { public: bool isMatch(string s, string p) { if (p[0] == '\0') return s[0]=='\0'; if (p[1] != '*'){ if (s[0] == p[0] || (p[0] == '.'&&s[0] != '\0')) return isMatch(s.substr(1), p.substr(1)); else return false; } else{ while (s[0] == p[0] || (p[0] == '.'&&s[0]!= '\0')){ if (isMatch(s, p.substr(2))) return true; s = s.substr(1); } return isMatch(s,p.substr(2)); } } };
相关文章推荐
- [动态规划]之裸lis之最长上升子序列POJ 2533
- Java中补码的规则
- osg布告板技术(Billboard)
- getRequestDispatcher ,sendRedirect
- 测试并发编程demo
- 求成绩
- hdoj 5681 zxa and wifi
- MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM
- shell脚本的使用---if变量编写lamp管理脚本
- hdu_4824_Disk Schedule(dp)
- QT信号槽多次连接引起的错误修改
- mybatis查询没有返回结果,程序不继续执行
- javascript基础-黑白反斗棋
- 使用Jmeter进行http接口测试
- centos 的权限管理--自主访问控制DAC和访问控制列表 ACL
- hdu_4824_Disk Schedule(dp)
- 提高Java代码质量的Eclipse插件之Checkstyle的使用详解
- 作业8:单元测试练习(个人练习)
- 【Gym 100971A】Treasure Island
- LaTeX技巧001:ctex下使用其他中文字体