leetcode做题记录0044

leetcode 0044

说明

只是为了记录一下,不求多快,也不深究。

会简要描述思路,代码中不写注释。

如碰到不会做的用了别人代码会在博客中标出。

题目描述

在这里插入图片描述
在这里插入图片描述

思路

又是正则匹配,很像之前的第10题,那时候看到这种题还是一脸懵逼,现在已经能写出来了,有进步。

还是用dp做,先初始化,dp[0][j]有可能是true,要看是不是全是*,dp[i][0]肯定就是false了。

然后就是一步步往下推,p里面遇到?是一定匹配的,那就看之前dp[i-1][j-1]是不是true了。

另一种情况是p里遇到*,如果dp[i][j-1]已经是true的话,说明这个*多余了,记作空,dp[i][j]当然是true;

如果dp[i][j-1]不匹配,就看dp[k][j-1]里面是否有匹配的,k属于0~i,毕竟*可以表示任何字符串,只要前面一部分匹配,后面不匹配的都能变出来。

class Solution {
    public boolean isMatch(String s, String p) {
		boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
		dp[0][0] = true;
		for (int i = 1; i < p.length() + 1; i++) {
			if (p.charAt(i - 1) == '*') {
				dp[0][i] = dp[0][i - 1];
			}
		}
		for (int i = 1; i <= s.length(); i++) {
			for (int j = 1; j <= p.length(); j++) {
				if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {
					dp[i][j] = dp[i - 1][j - 1];
				}
				if (p.charAt(j - 1) == '*') {
					if (dp[i][j - 1]) {
						dp[i][j] = true;
					} else {
						for (int k = 0; k < i; k++) {
							if (dp[k][j]) {
								dp[i][j] = true;
								break;
							}
						}
					}
				}
			}
		}
		return dp[s.length()][p.length()];
	}
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2049

猜你喜欢

转载自blog.csdn.net/Paul_1i/article/details/105271217
今日推荐