正则表达式 匹配 —— 剑指offer
剑指offer——正则表达式匹配
今天刚刚刷完剑指offer,感觉这道题蛮有意思的就记记笔记。
思路:主要考量*这个字符,然后还是通过动态规划的思路往前走(或者说贪婪匹配方式)。
首先判断pattern串是否为空,这里利用了C语言的空字串为’\0’来判断。 if(*pattern=='\0')
,整体状态就由str=='\0'
(空否)决定。
if(*pattern!='\0')
,此时字符串至少还有2个字符(末尾有\0
证),而由于 *
可以匹配多个字符模式,因此我们优先考虑下一个字符。
-
if(*(pattern+1) != '*')
则问题首先取决于当前两个字符相等于否(或者pattern是否等于 ‘.’),不符合直接return false; 满足问题又可转换为match(str+1, pattern+1); -
if(*(pattern+1) == '*')
则问题同上也判断当前两个字符相等于,不符合的话直接跨过2个字符的pattern(因为*
可以匹配0个数)。若当前的字符相等,问题又转换为三种情况- 贪婪匹配这个字符,这样可以让str走的更远
- 仅匹配该字符,之后跳过这个匹配模式(pattern+2)
- 直接跳过该匹配模式,适用于(
str="abca", pattern="abca*a"
),第一次做没考虑到这一点,没有ac。
代码如下~