44. 通配符匹配

题目描述查看:https://leetcode-cn.com/problems/wildcard-matching/

  题目的意思是给一个字符串s,给一个模式串p,要看p和s匹不匹配。模式串里可以出现‘?‘,匹配一个任意字符;可以出现‘*‘,匹配0个或多个任意字符。

  • 思路

创建一个数组dp[i][j]用来保存模式串p中的前i个字符和字符串s中的前j个字符匹不匹配。

dp[0][0]表示p中0个字符和s中0个字符匹不匹配,显然匹配。

dp[0][0] = true;

dp[0][i]表示p中0个字符和s中[1,s.length]之间个字符匹不匹配,显然不可能匹配。

dp[i][0]表示p中[1,p.length]个字符和s中0个字符匹不匹配,这要看p中第i个字符是不是‘*‘,这里的‘*‘表示空字符,‘*‘表示空字符的话,就看p中前一个字符和s匹不匹配。

        for (int i = 1; i <= p.length(); i++) {
            if(p.charAt(i-1) == ‘*‘)dp[i][0] = dp[i-1][0];
        }

处理完初始条件后,看之后的字符匹不匹配。

当p[i]是‘?‘或者p[i]==s[j]时候,就看p[0,i-1]和s[0,j-1]匹不匹配。

if(p.charAt(i-1) == ‘?‘ || p.charAt(i-1) == s.charAt(j-1))
                    dp[i][j] = dp[i-1][j-1];

当p[i]是‘*‘,要看‘*‘表示的是空字符,还是多个字符。

‘*‘表示空字符,那么看p[0,i-1]和s[0,j]匹不匹配。如:p=ab*,s=ab,p[0,1]=ab和s[0,1]匹配,‘*‘匹配0个字符。

‘*‘表示多个字符,那么看p[0,i]和s[0,j-1]匹不匹配。如:p=ab*,s=abcd。

 else if(p.charAt(i-1) == ‘*‘){
                    dp[i][j] = dp[i][j-1] || dp[i-1][j];
                }
  • 代码

 1     public boolean isMatch(String s, String p) {
 2         boolean[][] dp = new boolean[p.length()+1][s.length()+1];
 3         dp[0][0] = true;
 4         for (int i = 1; i <= p.length(); i++) {
 5             if(p.charAt(i-1) == ‘*‘)dp[i][0] = dp[i-1][0];
 6         }
 7
 8         for (int i = 1; i <= p.length() ; i++) {
 9             for (int j = 1; j <= s.length(); j++) {
10                 if(p.charAt(i-1) == ‘?‘ || p.charAt(i-1) == s.charAt(j-1))
11                     dp[i][j] = dp[i-1][j-1];
12                 else if(p.charAt(i-1) == ‘*‘){
13                     dp[i][j] = dp[i][j-1] || dp[i-1][j];
14                 }
15             }
16         }
17         return dp[p.length()][s.length()];
18     }

原文地址:https://www.cnblogs.com/vshen999/p/12630626.html

时间: 2024-11-02 23:16:22

44. 通配符匹配的相关文章

LeetCode 44. 通配符匹配

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完全匹配才算匹配成功. 说明: s 可能为空,且只包含从 a-z 的小写字母. p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *. 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "

LeetCode 44. 通配符匹配(Wildcard Matching)

题目描述 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完全匹配才算匹配成功. 说明: s 可能为空,且只包含从 a-z 的小写字母. p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *. 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 &

leetcode 44 通配符匹配(dp)

思路: 思路一: 利用两个指针进行遍历. 在代码里解释. 时间复杂度为:O(mn)O(mn)O(mn) 思路二: 动态规划 dp[i][j]表示s到i位置,p到j位置是否匹配! 初始化: dp[0][0]:什么都没有,所以为true    第一行dp[0][j],换句话说,s为空,与p匹配,所以只要p开始为*才为true    第一列dp[i][0],当然全部为False 动态方程: 如果(s[i] == p[j] || p[j] == "?") && dp[i-1][

Leetcode44. 通配符匹配(动态规划)

44. 通配符匹配 动态规划 \(f_{i,j}\)为\(s\)匹配\(i\),\(t\)匹配\(j\)是否成功 贪心 相比之下这个思维性更强 考虑两个*,两个星号间的过渡,只需要过渡完到第二个星号,第一个星号匹配多少已经无所谓了 所以贪心的处理已经匹配到的之前的最后一个星号的匹配个数 Code(copy) class Solution { public: bool isMatch(string s, string p) { int i = 0; int j = 0; int star = -1

LeetCode(44): 通配符匹配

Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完全匹配才算匹配成功. 说明: s 可能为空,且只包含从 a-z 的小写字母. p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *. 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a"

(Java) LeetCode 44. Wildcard Matching —— 通配符匹配

Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the enti

bzoj 3507: [Cqoi2014]通配符匹配

Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可以匹配恰好一个任意字符.现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的字符串,判断哪些文件可以被匹配. Input 第一行是一个由小写字母和上述通配符组成的字符串.第二行包含一个整数n,表示文件个数.接下来n行,每行为一个仅包含小写字母字符串,表示文件名列表. Output 输出n行

[BZOJ3507]通配符匹配

3507: [Cqoi2014]通配符匹配 Time Limit: 10 Sec  Memory Limit: 128 MB Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(""'),可以匹配0个及以上的任意字符:另一个是问号("?"),可以匹配恰好一个任意字符.现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的字符串,判断哪些文件可以被匹配. Input 第一行是一个

【BZOJ-3507】通配符匹配 DP + Hash

3507: [Cqoi2014]通配符匹配 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 372  Solved: 156[Submit][Status][Discuss] Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可以匹配恰好一个任意字符.现在需要你编写一个程序,对于给定的文件名列表和一个包