您的位置:首页 > 其它

leetcode.10. Regular Expression Matching

2016-05-16 22:26 375 查看
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") → 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));
}

}

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