題目:正則表達式匹配
題目描述
請實現一個函數用來匹配包括’.‘和’‘的正則表達式。模式中的字符’.‘表示任意一個字符,而’'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"abaca"匹配,但是與"aa.a"和"ab*a"均不匹配
解題思路:
ps: 來自劍指 offer評論區
當模式中的第二個字符不是“*”時:
1、如果字符串第一個字符和模式中的第一個字符相匹配,那麼字符串和模式都後移一個字符,然後匹配剩餘的。
2、如果 字符串第一個字符和模式中的第一個字符相不匹配,直接返回false。
而當模式中的第二個字符是“”時:
如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。如果字符串第一個字符跟模式第一個字符匹配,可以有3種匹配方式:
1、模式後移2字符,相當於x被忽略;
2、字符串後移1字符,模式後移2字符;
3、字符串後移1字符,模式不變,即繼續匹配字符下一位,因爲*可以匹配多位;
這裏需要注意的是:Java裏,要時刻檢驗數組是否越界。
代碼實現:
public class Solution {
public boolean match(char[] str, char[] pattern)
{
if (str == null || pattern == null) {
return false;
}
return match(str, 0, pattern, 0);
}
private boolean match(char[] str, int startS, char[] pattern, int startP) {
// 兩個都走到頭了
if (startS == str.length && startP == pattern.length) {
return true;
}
if (startS != str.length && startP == pattern.length) {
// pattern走到頭了,但是str沒有走到頭
return false;
}
// 都沒有走到頭
// 如果pattern[startP+1]是個*
if (startP + 1 < pattern.length && pattern[startP + 1] == '*') {
// 如果此時這個單詞匹配上那個模式裏面的,0次,1次,或者多次
if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
return match(str, startS, pattern, startP + 2) || match(str, startS + 1, pattern, startP + 2)
|| match(str, startS + 1, pattern, startP);
} else {
// 沒有匹配上,模式向後走兩步
return match(str, startS, pattern, startP + 2);
}
}
// 匹配那個點
if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
// 都往後走一步
return match(str, startS + 1, pattern, startP + 1);
} else {
return false;
}
}
}