通配符(dp)

在这里插入图片描述
在这里插入图片描述
思路在代码中:

class Solution {
public:
	bool isMatch(string s, string p) {
		// 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配 (true 的话表示匹配)
		// 状态转移方程:
		//      1. 当 s[i] == p[j],或者 p[j] == ? 那么 dp[i][j] = dp[i - 1][j - 1];
		//      2. 当 p[j] == * 那么 dp[i][j] = dp[i][j - 1] || dp[i - 1][j]    其中:
		//      dp[i][j - 1] 表示 * 代表的是空字符,例如 ab, ab*
		//      dp[i - 1][j] 表示 * 代表的是非空字符,例如 abcd, ab*
		// 初始化:
		//      1. dp[0][0] 表示什么都没有,其值为 true
		//      2. 第一行 dp[0][j],换句话说,s 为空,与 p 匹配,所以只有 p 全 * 才为 true
		//      3. 第一列 dp[i][0],当然全部为 false
		int m = s.length(), n = p.length();
		vector<vector<bool>>dp(m + 1, vector<bool>(n + 1, false));
		dp[0][0] = true;
		for (int j = 1; j <= n; j++)//初始化
		{
			if (p[j - 1] == '*') dp[0][j] = true;
			else break;
		}
		for (int i = 1; i <= m; i++)
			for (int j = 1; j <= n; j++)
			{
				if (s[i - 1] == p[j - 1] || p[j - 1] == '?')
					dp[i][j] = dp[i - 1][j - 1];
				else if (p[j - 1] == '*')
					dp[i][j] = dp[i][j - 1] || dp[i - 1][j]; //表示 * 代表的是空字符或非空字符
			}
		return dp[m][n];
	}
};
发布了212 篇原创文章 · 获赞 4 · 访问量 8788

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104757791