此題爲正則表達式匹配,只實現兩個字符的匹配,'*'和'.'正則表達式
'.' 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 }