LeetCode(中國)第十題:正則表示式匹配
阿新 • • 發佈:2019-01-03
題目:給定一個字串 (s) 和一個字元模式 (p)。實現支援 ‘.’ 和 ‘*’ 的正則表示式匹配。
‘.’ 匹配任意單個字元。
‘*’ 匹配零個或多個前面的元素。
匹配應該覆蓋整個字串 (s) ,而不是部分字串。
說明:
s 可能為空,且只包含從 a-z 的小寫字母。
p 可能為空,且只包含從 a-z 的小寫字母,以及字元 . 和 *。
語言:java
我用的方法是遞迴,str和pattern各自設定下標,思路是大體分兩種情況,一種是pattern的下一個字元為星號,一種是不為星號。區別在於下一次遞迴的下標引數不一樣。
private String str = "" ;
private String pattern = "";
public boolean isMatch(String s, String p) {
// 考慮幾個特殊樣例,比如兩個都為空,pattern為空。
if (s.equals(p)) {
return true;
}
if (p.equals("")) {
return false;
}
str = s;
pattern = p;
return match (0, 0);
}
public boolean match (int index1, int index2) {
boolean indexLast1 = index1 >= str.length();
boolean indexLast2 = index2 >= pattern.length();
// 當匹配到兩個字串的下標都到底的時候,匹配成功
if (indexLast1 && indexLast2) {
return true;
}
if (!indexLast1 && indexLast2) {
return false;
}
// 第一種情況:pattern的下一個字元為*號時
if (index2+1 < pattern.length() && pattern.charAt(index2+1) == '*') {
if (indexLast1) {
return match(index1, index2+2);
}
if (str.charAt(index1) == pattern.charAt(index2) || pattern.charAt(index2) == '.') {
// 匹配str的下一個字元或者拋棄這個星號去匹配pattern下一個模式
return match(index1+1, index2) || match(index1, index2+2);
} else {
return match(index1, index2+2);
}
}
if (indexLast1 && !indexLast2) {
return false;
}
// 第二種情況:pattern的下一個字元不為*,直接匹配單個字元
if (str.charAt(index1) == pattern.charAt(index2) || pattern.charAt(index2) == '.') {
return match(index1 + 1, index2 + 1);
}
return false;
}
為什麼要在裡面考慮indexLast1,就是當str的下標到底的時候呢,因為當str的下標到底時,pattern可能還有a*b*c*,這種情況也是匹配成功的,所以不能在開頭就斷定當indexLast1且!indexLast2的時候就匹配不成功。
而為了str不會訪問越界,判定indexLast的條件要放在第一種情況和第二種情況的開頭。
這種解法通過LeetCode(中國)於18年4月29日,用時71ms。(轉載請標明出處)