leetcode10(正则表达式匹配)

题目:给定一个字符串 (s) 和一个字符模式 p。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *

题解:动态规划法(用f[i][j]记录s前i个字符能否被p前j个字符匹配,若能匹配,则为true,否则为false)

这里用到了动态规划的思想,先从最短的s字符串和最短的字符模式p开始判断,再将字符串和字符模式逐渐加长,直到分别都达到了给定的长度

动态规划方程:
leetcode10(正则表达式匹配)_第1张图片

class solution
{
private:
	
public:
	bool solu(string s,string p) {
	    //i和j分别记录字符串和字符模式的长度
		int i = s.length();
		int j = p.length();
		//容器result存储匹配结果(true或者false)
		vector<vector<bool>> result(i , vector<bool>(j ));
		//字符串长度为0时是一定能匹配的
		for (int k = 0;k < j ;k++)
		{
			result[0][k] = true;
		}
		//字符模式长度为0时是一定不能匹配的
		for (int k = 1;k < i ;k++)
		{
			result[k][0] = false;
		}
		for(int m=1;m<i;m++)
			for (int k = 1;k < j;k++)
			{
			        //处理“*”字符,是这道题的难点
                    if (p[k] == '*') {
					if (s[m] == p[k - 1] || p[k - 1] == '.') {
						result[m][k] = result[m - 1][k];
					}
					else if (s[m] == p[k - 2] || p[k - 2] == '.') {
						result[m][k] = result[m][k - 2];
					}
					else result[m][k] = false;
					

				}
				else {
					if (p[k] == s[m]||p[k]=='.') {
						result[m][k] = result[m - 1][k - 1];
					}
					else result[m][k] = false;
					
				}
			}
			
		return result[i - 1][j - 1];
		
	}
	
	};

你可能感兴趣的:(每天一道算法题)