題目
10. 正則表達式匹配
題解
回溯思想
1 因爲這題目中提到:
所謂匹配,是要涵蓋 整個 字符串
s
的,而不是部分字符串。
所以這題就簡單了。
1 判斷是否當前的字符是否相等或者 p
的當前字符是 .
- 若爲
true
:繼續判斷p
的後一個字符是否爲*
:- 是
*
:保持當前的p遊標,而且接着判斷s的下一個字符。 - 不是
*
:保持當前的p遊標,而且接着判斷s的下兩個字符(其實忽略當前的不匹配的字符和*
字符)。
- 是
- 若爲
false
:繼續判斷p
的後一個字符是否爲*
:- 是
*
:保持當前的p遊標,而且接着判斷s的下兩個字符(其實忽略當前的不匹配的字符和*
字符)比如說:s="", p=“a*”; 這種情況下,依然可以判斷爲true。 - 不是
*
:可以退出了。
- 是
2 如果兩個字符串都到了末尾了,那麼就返回 true
3 如果已經判斷爲true
了,那麼就退出即可。
private int pLen = 0;
private int sLen = 0;
private boolean ans = false;
public boolean isMatch(String s, String p) {
if (s.length() == 0 && p.length() == 0) {
return true;
}
char[] sChars = s.toCharArray();
char[] pChars = p.toCharArray();
sLen = sChars.length;
pLen = pChars.length;
dfs(0, 0, sChars, pChars);
return ans;
}
private void dfs(int sIndex, int pIndex, char[] sChars, char[] pChars ) {
if (ans) {
return;
}
if (pIndex >= pLen) {
if (sIndex >= sLen) {
ans = true;
}
return;
}
boolean isMatched = sIndex < sLen && (pChars[pIndex] == '.' || sChars[sIndex] == pChars[pIndex]);
if (pIndex + 1 < pLen && pChars[pIndex + 1] == '*') {
dfs(sIndex, pIndex + 2, sChars, pChars);
if (isMatched) {
dfs(sIndex + 1, pIndex, sChars, pChars);
}
} else if (isMatched){
dfs(sIndex+1, pIndex+1, sChars, pChars);
}
}