题目描述
请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
示例1
输入
“aaa”,“a*a”
返回值
true
首先需要弄清楚题目意思,匹配是指字符串中的所有字符要匹配整个模式串,即两个串都要匹配到尾部。思路是递归遍历字符串和模式串,判断当前字符串和模式串是否匹配,其中*
要和其上一个字符串一起考虑,因此存在以下情况:
- 模式串下一个字符是
*
:- 当前字符串和模式串不匹配,则
*
的作用是将模式串的字符抵消,即出现0次,此时字符串指针不动,模式串指针+2,跳过`*`` - 若当前模式串和字符串匹配,或者模式串为
.
,则*
可能匹配多次或者0次,因此存在两种情况,匹配多次时,字符串指针+1,模式串不动,即_match(str, s + 1, pattern, p)
,匹配0次时,字符串指针不动,模式串+2跳过*
。需要注意前提是字符串指针不能越界,即s < str.length()
,字符串指针才能继续往下走。
- 当前字符串和模式串不匹配,则
- 下一个字符不是
*
:- 若模式串和字符串匹配,或者模式串为
.
,则字符串和模式串共同前进,同样需要注意字符串指针不能越界,即s < str.length()
- 否则返回false,匹配失败
- 若模式串和字符串匹配,或者模式串为
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
public boolean _match(String str, int s, String pattern, int p) {
if (s == str.length() && p == pattern.length()) return true;
if (p == pattern.length()) return false; // 字符串未匹配完,模式串已经完了
if ((p + 1) < pattern.length() && pattern.charAt(p + 1) == '*') {
// 模式串下一个字符是*
if (s < str.length() && (str.charAt(s) == pattern.charAt(p) || pattern.charAt(p) == '.'))
return _match(str, s + 1, pattern, p) || _match(str, s, pattern, p + 2); // *匹配多次 或 匹配一次
else
return _match(str, s, pattern, p + 2); // *的作用是将其抵消
} else {
if (s < str.length() && (str.charAt(s) == pattern.charAt(p) || pattern.charAt(p) == '.'))
return _match(str, s + 1, pattern, p + 1); // 匹配,两指针前进
else
return false;
}
}
public boolean match(String str, String pattern) {
// write code here
return _match(str, 0, pattern, 0);
}
}