zoukankan      html  css  js  c++  java
  • leetcode44

     1 class Solution {
     2     public boolean isMatch(String s, String p) {
     3         if (p == null || p.length() == 0) {
     4             return s == null || s.length() == 0;
     5         }
     6         boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
     7         dp[0][0] = true;
     8         int i, j;
     9 
    10         for (i = 1; i <= p.length(); i++) {
    11             if (p.charAt(i - 1) == '*') {
    12                 dp[0][i] = true;
    13             } else {
    14                 break;
    15             }
    16         }
    17 
    18         for (i = 1; i <= s.length(); i++) {
    19             for (j = 1; j <= p.length(); j++) {
    20                 // the letter of p[j] exactly match with s[i] or is '?'
    21                 if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {
    22                     dp[i][j] = dp[i - 1][j - 1];
    23                 }
    24 
    25                 // the letter of p is '*'
    26                 if (p.charAt(j - 1) == '*') {
    27                     /*
    28                      * dp[i][j] = dp[i][j-1] means '*' act as empty card dp[i][j] = dp[i-1][j] means
    29                      * '*' act as wild card to match with s[i]
    30                      */
    31                     dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
    32                 }
    33             }
    34         }
    35         return dp[s.length()][p.length()];
    36     }
    37 }

    参考:https://leetcode.com/problems/wildcard-matching/discuss/429337/Java%3A-Wild-card!

    补充一个python的实现:

     1 class Solution:
     2     def isMatch(self, s: str, p: str) -> bool:
     3         m,n = len(s),len(p)
     4         dp = [[False for _ in range(n+1)]for _ in range(m+1)]
     5         dp[0][0] = True
     6         
     7         for j in range(1,n+1):
     8             if p[j-1] == '*':
     9                 dp[0][j] = True
    10             else:
    11                 break
    12         for i in range(1,m+1):
    13             for j in range(1,n+1):
    14                 if s[i-1] == p[j-1] or p[j-1] == '?':
    15                     dp[i][j] = dp[i-1][j-1]
    16                 elif p[j-1] == '*':
    17                     dp[i][j] = dp[i-1][j] or dp[i][j-1]
    18         # print(dp)
    19         return dp[m][n]

    思路:动态规划。

    举例分析:s='acdcb' p='a*c?b' 。s长度为m,p长度为n。

    初始化二维数组dp,有m+1行,n+1列。

    dp[0][0] = True,先设置第0行,如果p中对应字符是‘*’,则设置为True,遇到非'*'后面都设置为False。

    从第1行开始,如果s与p中对应字符是相同或者p中是'?',则dp取其'左上角'元素的值。

    如果p中的字符是'*',则dp判断其'上方'和'左侧'的逻辑或,(即上方或左侧是否为True)。

  • 相关阅读:
    Android ImageView设置图片原理(下)
    C++ 虚函数表 多重继承
    C++ 虚函数表 单继承
    私有继承
    内联函数和宏定义的区别
    #pragma pack(x) CPU对齐
    static 变量(静态变量)
    C++ 中const作用
    如何连接宏参数
    几种常见容器比较和分析 hashmap, map, vector, list ...hash table
  • 原文地址:https://www.cnblogs.com/asenyang/p/10496280.html
Copyright © 2011-2022 走看看