请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。

分析:为了解决这种复杂类型的题目,我们想到的是利用递归。问题的难点出在'*'的匹配上,‘*’之前的元素可以出现0次,1次甚至是多次。

public class Solution{
// 匹配正则表达式
// 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
public boolean match(char[] str, char[] pattern) {
if (str.length == 0 && pattern.length == 0) {
return true;
} else if (str.length == 0) {
for (int i = 0; i < pattern.length; i++) {
if (pattern.length == 1 && pattern[i] == '.') {
return false;
}
if (pattern[i] != '*' && pattern[i] != '.') {
if (i + 1 < pattern.length) {
if (pattern[i + 1] == '*') {
i += 1;
continue;
} else {
return false;
}
}
}
if (i + 1 < pattern.length) {
if (pattern[i] == '.' && pattern[i + 1] != '*') {
return false;
}
} else if (pattern[i] == '.') {
return false;
}


}
return true;
} else if (pattern.length == 0) {
return false;
}


return match_core(str, pattern, 0, 0);
}


public boolean match_core(char[] str, char[] pattern, int str_length,
int pattern_length) {
if (str_length == str.length && pattern_length == pattern.length) {
// 匹配成功
return true;
}
if (str_length != str.length && pattern_length == pattern.length) {
// 匹配不成功
return false;
}
if (str_length == str.length && pattern_length != pattern.length) {
// 处理pattern剩余未匹配的字符
for (int i = pattern_length; i < pattern.length; i++) {
if (pattern[i] == '.') {
return false;
}
if (pattern[i] != '*' && pattern[i] != '.') {
// 例如:c*
if (i + 1 < pattern.length) {
if (pattern[i + 1] == '*') {
i += 1;
continue;
} else {
return false;
}
} else {
return false;
}
}
}
return true;
}
if (pattern_length + 1 < pattern.length
&& pattern[pattern_length + 1] == '*') {
// 当前字符的下一个字符是'*'
if (str[str_length] == pattern[pattern_length]
|| (pattern[pattern_length] == '.')) {
// 当前字符匹配成功
// 使用下一个字符'*'来匹配0个,多个,1个
return match_core(str, pattern, str_length, pattern_length + 2)
|| match_core(str, pattern, str_length + 1,
pattern_length)
|| match_core(str, pattern, str_length + 1,
pattern_length + 2);


} else {
// 当前字符匹配不成功,但是下一个字符是'*'
return match_core(str, pattern, str_length, pattern_length + 2);
}
}
if (str[str_length] == pattern[pattern_length]
|| (pattern[pattern_length] == '.')) {
return match_core(str, pattern, str_length + 1, pattern_length + 1);
}
return false;


}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值