1. 程式人生 > >劍指offer面試題53 正則表示式匹配

劍指offer面試題53 正則表示式匹配

public class Solution {

	public boolean match(char[] str, char[] pattern) {

		if (str == null || pattern == null) {
			return false;
		}
		int strIndex = 0;
		int patternIndex = 0;
		return matchCore(str, strIndex, pattern, patternIndex);
	}

	private boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex) {
		

			//有效性檢驗:str到尾,pattern到尾,匹配成功,相當於遞迴地結束條件
			if (strIndex == str.length && patternIndex == pattern.length) {
				return true;
			}
			//pattern先到尾,匹配失敗,相當於str的長度超過匹配的長度
			if (strIndex != str.length && patternIndex == pattern.length) {
				return false;
			}
			//模式第2個是*,且字串第1個跟模式第1個匹配,分3種匹配模式;如不匹配,模式後移2位
			if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') {
				if ((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)) {
						return matchCore(str, strIndex, pattern, patternIndex + 2)//模式後移2,視為x*匹配0個字元
								|| matchCore(str, strIndex + 1, pattern, patternIndex + 2)//視為模式匹配1個字元
								|| matchCore(str, strIndex + 1, pattern, patternIndex);//*匹配1個,再匹配str中的下一個
			} else {
				//模式後移2位,相當於x*匹配0個
				return matchCore(str, strIndex, pattern, patternIndex + 2);
				}
			}
			//模式第2個不是*,且字串第1個跟模式第1個匹配,則都後移1位,否則直接返回false
			if ((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)) {
				return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
			}
			
			return false;

	}