LeetCode_动态规划_困难_44.通配符匹配

x33g5p2x  于2022-07-22 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(307)

1.题目

给定一个字符串 ( s ) 和一个字符模式 ( p ) ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

示例 1:

  1. 输入:
  2. s = "aa"
  3. p = "a"
  4. 输出: false
  5. 解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

  1. 输入:
  2. s = "aa"
  3. p = "*"
  4. 输出: true
  5. 解释: '*' 可以匹配任意字符串。

示例 3:

  1. 输入:
  2. s = "cb"
  3. p = "?a"
  4. 输出: false
  5. 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'

示例 4:

  1. 输入:
  2. s = "adceb"
  3. p = "*a*b"
  4. 输出: true
  5. 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

示例 5:

  1. 输入:
  2. s = "acdcb"
  3. p = "a*c?b"
  4. 输出: false

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/wildcard-matching

2.思路

(1)动态规划
思路参考本题官方题解

3.代码实现(Java)

  1. //思路1————动态规划
  2. class Solution {
  3. public boolean isMatch(String s, String p) {
  4. int m = s.length();
  5. int n = p.length();
  6. //dp[i][j] 表示字符串 s 的前 i 个字符和模式 p 的前 j 个字符是否能匹配
  7. boolean[][] dp = new boolean[m + 1][n + 1];
  8. dp[0][0] = true;
  9. for (int i = 1; i <= n; i++) {
  10. if (p.charAt(i - 1) == '*') {
  11. dp[0][i] = true;
  12. } else {
  13. break;
  14. }
  15. }
  16. for (int i = 1; i <= m; i++) {
  17. for (int j = 1; j <= n; j++) {
  18. if (p.charAt(j - 1) == '*') {
  19. dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
  20. } else if (p.charAt(j - 1) == '?' || s.charAt(i - 1) == p.charAt(j - 1)) {
  21. dp[i][j] = dp[i - 1][j - 1];
  22. }
  23. }
  24. }
  25. return dp[m][n];
  26. }
  27. }

相关文章