10. Regular Expression Matching

此題爲正則表達式匹配,只實現兩個字符的匹配,'*'和'.'正則表達式

'.' Matches any single character.
'*' Matches zero or more of the preceding element.
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

這裏能夠看到*只會出如今第二位以後的位置,.能夠出如今任何位置代替任何單一字符
解題思路爲一點一點切割掉*,遞歸匹配
 1     public boolean isMatch(String s, String p) {
 2         // 防止空指針
 3         if (p == null) {
 4             return s == null;
 5         }
 6         if (s == null) {
 7             return p == null;
 8         }
 9         int lenS = s.length();
10         int lenP = p.length();
11         // 都用p作判斷是由於,要調用p.charAt防止數組下標溢出
12         if (lenP == 0) {
13             return lenS == 0;
14         }
15         // 若是lenP==1,要麼ps相等,要麼p=='.'
16         if (lenP == 1) {
17             if (p.equals(s) || (p.charAt(0) == '.' && lenS == 1)) {
18                 return true;
19             } else {
20                 return false;
21             }
22         }
23         // 上面已經寫好了基本單元的判斷,下面用遞歸,遞歸的條件是p的第二個字符是否爲'*'
24         if (p.charAt(1) != '*') {
25             if (s.length() > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) {
26                 return isMatch(s.substring(1), p.substring(1));
27             }
28             return false;
29         } else {
30             // 把*匹配的字符所有sub掉,在匹配剩下的
31             while (s.length() > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) {
32                 if (isMatch(s, p.substring(2))) {
33                     return true;
34                 }
35                 s = s.substring(1);
36             }
37             // 當while條件不知足時,兜一下
38             return isMatch(s, p.substring(2));
39         }
40     }
相關文章
相關標籤/搜索