1. 程式人生 > >劍指offer 16 正則表示式匹配

劍指offer 16 正則表示式匹配

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

解法:注意題目中說的出現0次,例如ab*aa若*代表出現0次的話,則表示為字串aaa。分析題目一共可分為如下情況處理:

  1. 兩個字串均為空,直接return false;
  2. str不為空,pattern為空 ,直接return false;
  3. str為空,pattern不為空  ,考慮是否為aaa  a*a*a*的情況 需繼續計算
  4. 當pattern下一個字元為* :(1)若*代表0個字元 則pattern直接後移兩個字元跳過*(2)若*代表一個或者多個字元 str後移一個字元
  5. 當pattern下一個字元不為*,直接比對當前字元是否匹配,若不匹配直接return false。匹配的話str與pattern同時後移一個字元。
class Solution
{
public:
	bool match(char* str, char* pattern)
	{
		if (str == nullptr && pattern == nullptr)
			return false;
		return matchcore(str, pattern);
	}
	bool matchcore(char* str, char* pattern)
	{
		if (*str =='\0'&&*pattern =='\0')
			return true ;
		if (*str != '\0'&&*pattern == '\0')
			return false;
		if (*(pattern+1) == '*')
		{
			if (*str == *pattern || (*pattern == '.'&&*str != '\0'))
				return matchcore(str + 1, pattern) || matchcore(str, pattern + 2);
			else
				return matchcore(str, pattern + 2); //*代表0個該字元
		}
		else
		{
			if (*str == *pattern || (*pattern == '.'&&*str != '\0'))
				return matchcore(str + 1, pattern + 1);
			else
				return false;

		}
		return false;
	}
};