10-Regular-Expression-Matching
0x0 题目详情
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
0x1 解题思路
这道题匹配正确的要求是被匹配串能够被完全匹配,而且当成功匹配时,匹配串的字符应该也被使用完成。
例如:
待匹配串:
bbbba,匹配串.*.*b
返回的结果应该是false,虽然匹配串中的.*已经足够匹配出完整的bbbba,但是因为匹配串最后有一个字符b,导致匹配失败。
我们使用指针strIndex指向匹配串中的字符,patternIndex指向匹配串中对应的字符,匹配的具体规则如下:
如果当前字符匹配成功,或者匹配串中对应的字符为
.,那么就需要查看匹配串中对应的下一个字符是否为*:patternIndex下一个位置的字符为*,那么将有三种情况:仅使用当前匹配串
patternIndex对应的字符一次,也就是*不起作用,strIndex+=1,patternIndex+=2使用当前匹配串
patternIndex对应的字符多次,strIndex+=1,patternIndex+=0不使用当前匹配串
patternIndex对应的字符串,那么对应的指针变化为strIndex+=0,patternIndex+=2
patternIndex下一个位置的字符不为*,那么直接将strIndex和patternIndex各自加1,匹配下一个字符
如果当前字符匹配失败,那么需要查看
patternIndex的下一个位置是否为*:下一个位置如果为
*,那么在匹配串中直接当前字符和下一字符,strIndex+=0,patternIndex+=2下一个位置不为
*,那么匹配失败,返回false
上述规则是递归的思路,递归写出来了,而且是无后效性的,直接改为动态规划即可。
0x2 代码实现
递归版本:
``` java "递归版本" class Solution { public boolean isMatch(String s, String p) { if(s==null && p==null){ return true; } if(s.length()==0 && p.length()==0) { return true; } if(s.length()!=0 && (p==null || p.length()==0)){ return false; } char[] str=s.toCharArray(); char[] pattern=p.toCharArray(); int strIndex=0; int patternIndex=0; return recur(str,pattern,0,0);
}
0x3 课后总结
这题还是有点难度的,尤其是下面这种情况:
待匹配串:
bbbba,匹配串.*.*b
虽然使用x*匹配成功后,但是不使用这个组合我是没想到的(x代表任意字符)。
Last updated
Was this helpful?