1. 程式人生 > >LeetCode(中國)第十題:正則表示式匹配

LeetCode(中國)第十題:正則表示式匹配

題目:給定一個字串 (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。(轉載請標明出處)