劍指 offer之正則表達式匹配_Java

題目:正則表達式匹配

題目描述
請實現一個函數用來匹配包括’.‘和’‘的正則表達式。模式中的字符’.‘表示任意一個字符,而’'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"abaca"匹配,但是與"aa.a"和"ab*a"均不匹配

解題思路:
ps: 來自劍指 offer評論區
當模式中的第二個字符不是“*”時:
1、如果字符串第一個字符和模式中的第一個字符相匹配,那麼字符串和模式都後移一個字符,然後匹配剩餘的。
2、如果 字符串第一個字符和模式中的第一個字符相不匹配,直接返回false。

而當模式中的第二個字符是“”時:
如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。如果字符串第一個字符跟模式第一個字符匹配,可以有3種匹配方式:
1、模式後移2字符,相當於x
被忽略;
2、字符串後移1字符,模式後移2字符;
3、字符串後移1字符,模式不變,即繼續匹配字符下一位,因爲*可以匹配多位;
這裏需要注意的是:Java裏,要時刻檢驗數組是否越界。

代碼實現:


public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        if (str == null || pattern == null) {
				return false;
			}
			return match(str, 0, pattern, 0);

		}

		private boolean match(char[] str, int startS, char[] pattern, int startP) {

			// 兩個都走到頭了
			if (startS == str.length && startP == pattern.length) {
				return true;
			}
			if (startS != str.length && startP == pattern.length) {
				// pattern走到頭了,但是str沒有走到頭
				return false;
			}
			// 都沒有走到頭
			// 如果pattern[startP+1]是個*
			if (startP + 1 < pattern.length && pattern[startP + 1] == '*') {
				// 如果此時這個單詞匹配上那個模式裏面的,0次,1次,或者多次
				if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
					return match(str, startS, pattern, startP + 2) || match(str, startS + 1, pattern, startP + 2)
							|| match(str, startS + 1, pattern, startP);
				} else {
					// 沒有匹配上,模式向後走兩步
					return match(str, startS, pattern, startP + 2);
				}
			}
			// 匹配那個點
			if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
				// 都往後走一步
				return match(str, startS + 1, pattern, startP + 1);
			} else {
				return false;
			}
		}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章