1. 程式人生 > >劍指offer——正則表示式匹配(遞迴呼叫)

劍指offer——正則表示式匹配(遞迴呼叫)

當模式中的第二個字元不是“*”時:

1、如果字串第一個字元和模式中的第一個字元相匹配,那麼字串和模式都後移一個字元,然後匹配剩餘的。

2、如果 字串第一個字元和模式中的第一個字元相不匹配,直接返回false。

而當模式中的第二個字元是“*”時:

如果字串第一個字元跟模式第一個字元不匹配,則模式後移2個字元,繼續匹配。如果字串第一個字元跟模式第一個字元匹配,可以有3種匹配方式:

1、模式後移2字元,相當於x*被忽略;

2、字串後移1字元,模式後移2字元;

3、字串後移1字元,模式不變,即繼續匹配字元下一位,因為*可以匹配多位;

class Solution {
public:
	bool match(char* str, char* pattern)
	{
		if (*str == '\0' && *pattern == '\0')return true;
		if (*pattern == '\0')return false;
		//模式串下一個字元不是'*'
		if(*(pattern + 1) != '*')
		{
			//檢視當前位置是否匹配
			if(*str == *pattern || (*str != '\0' && *pattern == '.'))
				return match(str + 1, pattern + 1);//匹配的話進行下一個字元比較
			else
				return false;//不匹配則返回錯誤
		}else//模式串下一個字元是'*'
		{
			//檢視當前位置是否匹配
			if (*str == *pattern || (*str != '\0' && *pattern == '.'))
				//1、匹配一個   2、不想匹配   3、 可能可以匹配多個,僅字串走一步即可
				return match(str + 1, pattern + 2) || match(str, pattern + 2) || match(str + 1, pattern);
			else
				return match(str, pattern + 2);//不匹配,模式串走兩步
		}
	}
};