LeetCode 10. 正則表達式匹配(Java 版本)

題目

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);
	}
}
發佈了139 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章